From 2f0569ed75ef8a1fb60f992d19c8bbdf92ff45bf Mon Sep 17 00:00:00 2001 From: Ashik Alias Date: Tue, 17 Mar 2020 17:15:19 +0530 Subject: [PATCH] NETVIRT-1630 migrate to md-sal APIs 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 Signed-off-by: Chetan Arakere Gowdru --- aclservice/impl/pom.xml | 14 +- .../aclservice/AbstractAclServiceImpl.java | 2 +- .../aclservice/AclServiceImplFactory.java | 2 +- .../aclservice/EgressAclServiceImpl.java | 4 +- .../aclservice/IngressAclServiceImpl.java | 4 +- .../listeners/AclElanInterfaceListener.java | 38 +- .../listeners/AclEventListener.java | 44 ++- .../listeners/AclInterfaceListener.java | 32 +- .../listeners/AclInterfaceStateListener.java | 40 +- .../aclservice/listeners/AclNodeListener.java | 37 +- .../recovery/AclInstanceRecoveryHandler.java | 6 +- .../recovery/AclInterfaceRecoveryHandler.java | 4 +- .../stats/AclLiveStatisticsHelper.java | 2 +- .../AclLiveStatisticsRpcServiceImpl.java | 2 +- .../aclservice/utils/AclServiceUtils.java | 38 +- .../OSGI-INF/blueprint/aclservice.xml | 2 +- .../AclLiveStatisticsRpcServiceTest.java | 9 +- .../aclservice/tests/AclServiceTestBase.java | 8 +- .../tests/AclServiceTestModule.java | 27 +- .../tests/IdentifiedAceBuilder.java | 4 +- .../IdentifiedInterfaceWithAclBuilder.java | 4 +- .../tests/StateInterfaceBuilderHelper.java | 6 +- .../tests/infra/DataBrokerPairsUtil.java | 10 +- ...taTreeIdentifierDataObjectPairBuilder.java | 6 +- bgpmanager/impl/pom.xml | 13 +- .../bgpmanager/BgpConfigurationManager.java | 372 ++++++------------ .../netvirt/bgpmanager/BgpManager.java | 10 +- .../netvirt/bgpmanager/BgpUtil.java | 61 ++- .../bgpmanager/EvpnRdNetworkListener.java | 44 ++- .../netvirt/bgpmanager/FibDSWriter.java | 6 +- .../OSGI-INF/blueprint/bgpmanager.xml | 2 +- .../test/AbstractMockFibManager.java | 4 +- .../bgpmanager/test/BgpManagerTest.java | 4 +- .../bgpmanager/test/MockFibManager.java | 14 +- cloud-servicechain/impl/pom.xml | 6 +- .../ElanServiceChainHandler.java | 6 +- .../VPNServiceChainHandler.java | 14 +- .../jobs/AddVpnPseudoPortDataJob.java | 6 +- .../jobs/RemoveVpnPseudoPortDataJob.java | 4 +- .../jobs/VpnPseudoPortDataBaseJob.java | 4 +- .../CloudScVpnInterfaceListener.java | 12 +- .../listeners/ElanDpnInterfacesListener.java | 6 +- .../listeners/VpnPseudoPortListener.java | 4 +- .../listeners/VpnToDpnListener.java | 8 +- .../VpnToElanFallbackNodeListener.java | 4 +- .../listeners/VrfListener.java | 6 +- .../utils/ElanServiceChainUtils.java | 8 +- .../utils/VpnPseudoPortCache.java | 6 +- .../utils/VpnServiceChainUtils.java | 10 +- .../OSGI-INF/blueprint/cloud-servicechain.xml | 2 +- .../VPNServiceChainHandlerTest.java | 30 +- dhcpservice/impl/pom.xml | 4 +- .../DhcpAllocationPoolListener.java | 40 +- .../DhcpAllocationPoolManager.java | 23 +- .../dhcpservice/DhcpConfigListener.java | 33 +- .../DhcpDesignatedDpnListener.java | 47 +-- .../DhcpExternalTunnelManager.java | 57 ++- .../DhcpInterfaceConfigListener.java | 34 +- .../DhcpInterfaceEventListener.java | 34 +- .../netvirt/dhcpservice/DhcpL2GwUtil.java | 50 ++- .../netvirt/dhcpservice/DhcpManager.java | 25 +- .../dhcpservice/DhcpMcastMacListener.java | 6 +- .../dhcpservice/DhcpNeutronPortListener.java | 46 +-- .../netvirt/dhcpservice/DhcpNodeListener.java | 40 +- .../netvirt/dhcpservice/DhcpPktHandler.java | 5 +- .../netvirt/dhcpservice/DhcpServiceUtils.java | 65 ++- .../dhcpservice/DhcpSubnetListener.java | 43 +- .../dhcpservice/DhcpUCastMacListener.java | 67 ++-- .../netvirt/dhcpservice/NodeListener.java | 34 +- .../jobs/DhcpAllocationPoolAddJob.java | 2 +- .../jobs/DhcpAllocationPoolRemoveJob.java | 2 +- .../dhcpservice/jobs/DhcpInterfaceAddJob.java | 4 +- .../jobs/DhcpInterfaceRemoveJob.java | 6 +- .../jobs/DhcpInterfaceUpdateJob.java | 4 +- .../OSGI-INF/blueprint/dhcpservice.xml | 2 +- .../netvirt/elanmanager/api/ElanHelper.java | 9 +- elanmanager/impl/pom.xml | 16 +- .../netvirt/elan/cache/ConfigMcastCache.java | 5 +- .../netvirt/elan/cache/ElanInstanceCache.java | 10 +- .../elan/cache/ElanInterfaceCache.java | 14 +- .../elan/cli/l2gw/L2GwValidateCli.java | 22 +- .../cli/l2gw/NetworkL2gwDeviceInfoCli.java | 124 +++--- .../evpn/listeners/ElanMacEntryListener.java | 49 ++- .../listeners/EvpnElanInstanceListener.java | 37 +- .../evpn/listeners/MacVrfEntryListener.java | 41 +- .../elan/evpn/utils/ElanEvpnFlowUtils.java | 2 +- .../elan/evpn/utils/EvpnMacVrfUtils.java | 20 +- .../netvirt/elan/evpn/utils/EvpnUtils.java | 70 ++-- .../elan/internal/ElanBridgeManager.java | 6 +- .../ElanDpnInterfaceClusteredListener.java | 36 +- .../internal/ElanDpnInterfacesListener.java | 39 +- .../ElanDpnToTransportZoneListener.java | 48 ++- .../internal/ElanExtnTepConfigListener.java | 39 +- .../elan/internal/ElanExtnTepListener.java | 35 +- .../netvirt/elan/internal/ElanGroupCache.java | 58 ++- .../elan/internal/ElanInstanceManager.java | 36 +- .../internal/ElanInterfaceConfigListener.java | 38 +- .../elan/internal/ElanInterfaceManager.java | 71 ++-- .../ElanInterfaceStateChangeListener.java | 48 ++- .../ElanInterfaceStateClusteredListener.java | 34 +- .../ElanLearntVpnVipToPortListener.java | 50 ++- .../elan/internal/ElanNodeListener.java | 34 +- .../elan/internal/ElanOvsdbNodeListener.java | 36 +- .../elan/internal/ElanPacketInHandler.java | 14 +- .../elan/internal/ElanServiceProvider.java | 22 +- .../internal/ElanSmacFlowEventListener.java | 16 +- .../ElanTunnelInterfaceStateListener.java | 37 +- .../internal/InterfaceAddWorkerOnElan.java | 2 +- .../InterfaceAddWorkerOnElanInterface.java | 2 +- .../internal/InterfaceRemoveWorkerOnElan.java | 2 +- .../InterfaceRemoveWorkerOnElanInterface.java | 2 +- .../VpnDpnToTransportZoneListener.java | 45 ++- .../netvirt/elan/l2gw/ha/HwvtepHAUtil.java | 6 +- .../elan/l2gw/ha/commands/IMergeCommand.java | 2 +- .../elan/l2gw/ha/commands/MergeCommand.java | 8 +- .../ha/handlers/ConfigNodeUpdatedHandler.java | 2 +- .../elan/l2gw/ha/handlers/HAEventHandler.java | 2 +- .../l2gw/ha/handlers/IHAEventHandler.java | 2 +- .../ha/handlers/NodeConnectedHandler.java | 10 +- .../elan/l2gw/ha/handlers/NodeCopier.java | 8 +- .../ha/handlers/OpNodeUpdatedHandler.java | 2 +- .../ha/listeners/HAConfigNodeListener.java | 8 +- .../ha/listeners/HAOpClusteredListener.java | 19 +- .../l2gw/ha/listeners/HAOpNodeListener.java | 17 +- .../ha/listeners/HwvtepNodeBaseListener.java | 27 +- .../ha/listeners/HwvtepNodeDataListener.java | 204 ---------- .../l2gw/ha/listeners/ManagerListener.java | 39 +- .../ha/merge/MergeCommandsAggregator.java | 7 +- .../l2gw/jobs/AssociateHwvtepToElanJob.java | 27 +- .../elan/l2gw/jobs/BcGroupUpdateJob.java | 8 +- .../jobs/DeleteL2GwDeviceMacsFromElanJob.java | 2 +- .../l2gw/jobs/DeleteLogicalSwitchJob.java | 9 +- .../jobs/DisAssociateHwvtepFromElanJob.java | 6 +- .../netvirt/elan/l2gw/jobs/DpnDmacJob.java | 4 +- .../jobs/HwvtepDeviceMcastMacUpdateJob.java | 2 +- .../elan/l2gw/jobs/LogicalSwitchAddedJob.java | 8 +- .../elan/l2gw/jobs/McastUpdateJob.java | 8 +- .../elan/l2gw/listeners/ChildListener.java | 14 +- .../l2gw/listeners/ElanGroupListener.java | 36 +- .../ElanInstanceEntityOwnershipListener.java | 11 +- .../l2gw/listeners/ElanInstanceListener.java | 44 +-- .../l2gw/listeners/ElanMacTableCache.java | 36 +- .../l2gw/listeners/HwvtepConfigNodeCache.java | 43 +- .../HwvtepPhysicalSwitchListener.java | 38 +- .../HwvtepRemoteMcastMacListener.java | 28 +- .../HwvtepTerminationPointListener.java | 37 +- .../L2GatewayConnectionListener.java | 72 ++-- .../l2gw/listeners/L2GatewayListener.java | 44 +-- .../l2gw/listeners/LocalUcastMacListener.java | 16 +- ...ewayConnectionInstanceRecoveryHandler.java | 42 +- .../L2GatewayInstanceRecoveryHandler.java | 60 +-- .../utils/ElanL2GatewayMulticastUtils.java | 40 +- .../elan/l2gw/utils/ElanL2GatewayUtils.java | 80 ++-- .../netvirt/elan/l2gw/utils/ElanRefUtil.java | 2 +- .../l2gw/utils/L2GatewayConnectionUtils.java | 96 +++-- .../elan/l2gw/utils/L2gwServiceProvider.java | 2 +- .../l2gw/utils/StaleVlanBindingsCleaner.java | 25 +- .../impl/ElanInterfaceRecoveryHandler.java | 2 +- .../elan/statisitcs/ElanStatisticsImpl.java | 2 +- .../netvirt/elan/utils/ElanClusterUtils.java | 2 +- .../netvirt/elan/utils/ElanDmacUtils.java | 2 +- .../netvirt/elan/utils/ElanEtreeUtils.java | 6 +- .../utils/ElanForwardingEntriesHandler.java | 6 +- .../netvirt/elan/utils/ElanItmUtils.java | 2 +- .../netvirt/elan/utils/ElanUtils.java | 102 +++-- .../utils/TransportZoneNotificationUtil.java | 56 +-- .../OSGI-INF/blueprint/elanmanager.xml | 6 +- .../elan/l2gw/LogicalSwitchesCmdTest.java | 6 +- .../NodeConnectedHandlerTest.java | 10 +- .../NodeConnectedHandlerUtils.java | 2 +- .../l2gw/nodehandlertest/TestComparators.java | 19 +- .../elan/l2gw/nodehandlertest/TestUtil.java | 16 +- .../elanmanager/tests/ElanServiceTest.java | 12 +- .../tests/ElanServiceTestBase.java | 11 +- .../tests/ElanServiceTestModule.java | 24 +- .../elanmanager/tests/L2gwBuilders.java | 4 +- .../elanmanager/tests/Verifications.java | 8 +- .../tests/utils/BgpManagerTestImpl.java | 4 +- .../tests/utils/EvpnTestHelper.java | 6 +- .../tests/utils/VpnManagerTestImpl.java | 2 +- .../netvirt/fibmanager/api/FibHelper.java | 13 +- .../netvirt/fibmanager/api/IFibManager.java | 10 +- .../fibmanager/BaseVrfEntryHandler.java | 21 +- .../fibmanager/BgpRouteVrfEntryHandler.java | 17 +- .../fibmanager/EvpnVrfEntryHandler.java | 10 +- .../netvirt/fibmanager/FibManagerImpl.java | 8 +- .../netvirt/fibmanager/FibRpcServiceImpl.java | 24 +- .../netvirt/fibmanager/FibUtil.java | 172 ++++++-- .../netvirt/fibmanager/NexthopManager.java | 54 ++- .../RouterInterfaceVrfEntryHandler.java | 2 +- .../netvirt/fibmanager/VrfEntryListener.java | 119 +++--- .../OSGI-INF/blueprint/fibmanager.xml | 2 +- .../fibmanager/test/FibManagerTest.java | 8 +- .../fibmanager/shell/ShowFibCommand.java | 6 +- .../OSGI-INF/blueprint/blueprint.xml | 2 +- ipv6service/impl/pom.xml | 4 +- .../netvirt/ipv6service/IfMgr.java | 2 +- .../netvirt/ipv6service/Ipv6NodeListener.java | 37 +- .../Ipv6ServiceInterfaceEventListener.java | 34 +- .../NeutronNetworkChangeListener.java | 38 +- .../NeutronPortChangeListener.java | 34 +- .../NeutronRouterChangeListener.java | 35 +- .../NeutronSubnetChangeListener.java | 35 +- .../ipv6service/utils/Ipv6ServiceUtils.java | 15 +- .../OSGI-INF/blueprint/ipv6service.xml | 2 +- natservice/impl/pom.xml | 4 + .../cli/DisplayNaptSwithcesCli.java | 12 +- .../natservice/ha/NatSwitchCacheImpl.java | 2 +- .../SnatCentralizedSwitchChangeListener.java | 35 +- .../natservice/ha/SnatNodeEventListener.java | 20 +- .../WeightedCentralizedSwitchScheduler.java | 29 +- .../internal/AbstractSnatService.java | 10 +- .../internal/ConntrackBasedSnatService.java | 4 +- .../internal/EvpnDnatFlowProgrammer.java | 8 +- .../natservice/internal/EvpnNaptSwitchHA.java | 2 +- .../internal/EvpnSnatFlowProgrammer.java | 2 +- .../ExternalNetworkGroupInstaller.java | 2 +- .../ExternalNetworksChangeListener.java | 71 ++-- .../internal/ExternalRoutersListener.java | 69 ++-- .../ExternalSubnetChangeListener.java | 35 +- .../ExternalSubnetVpnInstanceListener.java | 37 +- .../FlatVlanConntrackBasedSnatService.java | 2 +- .../internal/FloatingIPListener.java | 40 +- .../internal/Ipv6ForwardingService.java | 2 +- .../internal/Ipv6SubnetFlowProgrammer.java | 4 +- .../internal/NAPTSwitchSelector.java | 19 +- .../natservice/internal/NaptEventHandler.java | 2 +- .../natservice/internal/NaptManager.java | 84 +++- .../natservice/internal/NaptSwitchHA.java | 15 +- .../internal/NatArpNotificationHandler.java | 6 +- .../natservice/internal/NatEvpnUtil.java | 8 +- .../NatInterfaceStateChangeListener.java | 37 +- .../internal/NatRouterInterfaceListener.java | 37 +- .../natservice/internal/NatScalein.java | 9 +- .../internal/NatSouthboundEventHandlers.java | 20 +- .../internal/NatSwitchCacheListenerImpl.java | 3 +- .../internal/NatTepChangeListener.java | 55 ++- .../NatTunnelInterfaceStateListener.java | 52 +-- .../netvirt/natservice/internal/NatUtil.java | 150 ++++--- .../internal/NatVpnMapsChangeListener.java | 37 +- .../internal/RouterDpnChangeListener.java | 39 +- .../internal/RouterPortsListener.java | 38 +- .../internal/SNATDefaultRouteProgrammer.java | 2 +- .../internal/SnatExternalRoutersListener.java | 46 ++- .../internal/SnatServiceImplFactory.java | 2 +- .../internal/SubnetGwMacChangeListener.java | 36 +- .../internal/SubnetmapListener.java | 36 +- .../internal/UpgradeStateListener.java | 14 +- .../natservice/internal/VipStateTracker.java | 4 +- .../internal/VpnFloatingIpHandler.java | 7 +- .../VxlanGreConntrackBasedSnatService.java | 2 +- .../rpcservice/NatRpcServiceImpl.java | 2 +- .../resources/OSGI-INF/blueprint/commands.xml | 4 +- .../OSGI-INF/blueprint/natservice.xml | 2 +- neutronvpn/api/pom.xml | 9 +- .../neutronvpn/api/utils/ChangeUtils.java | 4 +- .../neutronvpn/api/utils/NeutronUtils.java | 6 +- .../interfaces/INeutronVpnManager.java | 3 +- .../netvirt/neutronvpn/HostConfigCache.java | 8 +- .../NeutronBgpvpnChangeListener.java | 36 +- ...loatingToFixedIpMappingChangeListener.java | 46 +-- .../NeutronHostConfigChangeListener.java | 46 +-- .../NeutronNetworkChangeListener.java | 53 +-- .../neutronvpn/NeutronPortChangeListener.java | 75 ++-- .../NeutronRouterChangeListener.java | 38 +- .../NeutronSecurityGroupListener.java | 39 +- .../neutronvpn/NeutronSecurityGroupUtils.java | 6 +- .../NeutronSecurityRuleListener.java | 38 +- .../NeutronSubnetChangeListener.java | 44 +-- .../NeutronTrunkChangeListener.java | 34 +- .../netvirt/neutronvpn/NeutronvpnManager.java | 70 ++-- .../neutronvpn/NeutronvpnManagerImpl.java | 3 +- .../neutronvpn/NeutronvpnNatManager.java | 32 +- .../netvirt/neutronvpn/NeutronvpnUtils.java | 43 +- .../neutronvpn/UpgradeStateListener.java | 10 +- .../evpn/manager/NeutronEvpnManager.java | 10 +- .../evpn/utils/NeutronEvpnUtils.java | 14 +- .../AddL2GwDevicesToTransportZoneJob.java | 2 +- .../l2gw/L2GwTransportZoneListener.java | 46 +-- .../OSGI-INF/blueprint/neutronvpn.xml | 2 +- .../NeutronPortChangeListenerTest.java | 16 +- .../shell/DhcpConfigureCommand.java | 4 +- .../neutronvpn/shell/DhcpShowCommand.java | 4 +- .../netvirt/neutronvpn/shell/ShowSubnet.java | 15 +- .../neutronvpn/shell/ShowVpnIpToPort.java | 15 +- .../OSGI-INF/blueprint/blueprint.xml | 2 +- .../PolicyAceFlowProgrammer.java | 14 +- .../PolicyRouteFlowProgrammer.java | 6 +- .../PolicyRouteGroupProgrammer.java | 4 +- .../listeners/PolicyAceChangeListener.java | 6 +- .../listeners/PolicyNodeListener.java | 6 +- .../PolicyProfileChangeListener.java | 6 +- .../listeners/TunnelStateChangeListener.java | 4 +- .../TunnelUnderlayNetworkChangeListener.java | 4 +- .../listeners/UnderlayNetworkDpnListener.java | 4 +- .../util/PolicyServiceFlowUtil.java | 2 +- .../policyservice/util/PolicyServiceUtil.java | 42 +- .../OSGI-INF/blueprint/policyservice.xml | 2 +- .../qosservice/QosAlertConfigListener.java | 35 +- .../netvirt/qosservice/QosAlertManager.java | 4 +- .../QosInterfaceStateChangeListener.java | 49 +-- .../QosNeutronNetworkChangeListener.java | 39 +- .../QosNeutronPortChangeListener.java | 37 +- .../netvirt/qosservice/QosNeutronUtils.java | 22 +- .../netvirt/qosservice/QosNodeListener.java | 42 +- .../qosservice/QosPolicyChangeListener.java | 75 ++-- .../QosTerminationPointListener.java | 40 +- .../netvirt/qosservice/UuidUtil.java | 4 +- .../OSGI-INF/blueprint/qosservice.xml | 2 +- .../netvirt/qosservice/UuidUtilTest.java | 9 +- statemanager/impl/pom.xml | 4 +- .../netvirt/statemanager/StateManager.java | 2 +- .../OSGI-INF/blueprint/statemanager.xml | 2 +- .../statistics/AbstractCountersService.java | 2 +- .../CountersServiceInterfaceListener.java | 6 +- .../statistics/EgressCountersServiceImpl.java | 4 +- .../IngressCountersServiceImpl.java | 4 +- .../netvirt/statistics/StatisticsImpl.java | 38 +- .../statistics/StatisticsProvider.java | 2 +- .../OSGI-INF/blueprint/statistics.xml | 6 +- .../netvirt/vpnmanager/api/IVpnManager.java | 3 +- .../vpnmanager/api/InterfaceUtils.java | 13 +- .../vpnmanager/api/VpnExtraRouteHelper.java | 61 ++- .../netvirt/vpnmanager/api/VpnHelper.java | 12 +- .../api/intervpnlink/InterVpnLinkCache.java | 2 +- .../InterVpnLinkDataComposite.java | 72 ++-- vpnmanager/impl/pom.xml | 14 +- .../CentralizedSwitchChangeListener.java | 39 +- .../vpnmanager/DpnInVpnChangeListener.java | 9 +- .../vpnmanager/FibEntriesListener.java | 34 +- .../InterfaceStateChangeListener.java | 38 +- .../vpnmanager/SubnetOpDpnManager.java | 24 +- ...bnetRouteInterfaceStateChangeListener.java | 45 ++- .../SubnetRoutePacketInHandler.java | 20 +- .../vpnmanager/SubnetmapChangeListener.java | 47 +-- .../TunnelEndPointChangeListener.java | 36 +- .../TunnelInterfaceStateListener.java | 43 +- .../VpnElanInterfaceChangeListener.java | 38 +- .../vpnmanager/VpnFootprintService.java | 8 +- .../vpnmanager/VpnInstanceListener.java | 72 ++-- .../vpnmanager/VpnInterfaceManager.java | 84 ++-- .../vpnmanager/VpnInterfaceOpListener.java | 41 +- .../netvirt/vpnmanager/VpnManagerImpl.java | 13 +- .../netvirt/vpnmanager/VpnNodeListener.java | 35 +- .../vpnmanager/VpnOpStatusListener.java | 50 +-- .../netvirt/vpnmanager/VpnRpcServiceImpl.java | 4 +- .../VpnServiceElanDpnInterfacesListener.java | 45 +-- .../vpnmanager/VpnSubnetRouteHandler.java | 30 +- .../netvirt/vpnmanager/VpnUtil.java | 62 +-- .../arp/responder/ArpResponderHandler.java | 4 +- .../intervpnlink/IVpnLinkServiceImpl.java | 29 +- .../intervpnlink/InterVpnLinkCacheFeeder.java | 41 +- .../intervpnlink/InterVpnLinkCacheImpl.java | 86 ++-- .../intervpnlink/InterVpnLinkListener.java | 39 +- .../intervpnlink/InterVpnLinkLocator.java | 16 +- .../intervpnlink/InterVpnLinkNodeAddTask.java | 8 +- .../InterVpnLinkNodeListener.java | 36 +- .../InterVpnLinkStateCacheFeeder.java | 41 +- .../InterVpnLinkStateListener.java | 37 +- .../intervpnlink/InterVpnLinkUtil.java | 14 +- .../tasks/InterVpnLinkCleanedCheckerTask.java | 6 +- .../tasks/InterVpnLinkCreatorTask.java | 6 +- .../tasks/InterVpnLinkRemoverTask.java | 4 +- .../AbstractIpLearnNotificationHandler.java | 2 +- .../iplearn/AlivenessMonitorUtils.java | 23 +- .../iplearn/IpMonitorEventListener.java | 2 +- .../iplearn/IpMonitorStartTask.java | 2 +- .../vpnmanager/iplearn/IpMonitorStopTask.java | 5 +- .../iplearn/IpMonitoringHandler.java | 42 +- .../LearntVpnVipToPortEventProcessor.java | 46 +-- .../impl/L3vpnOverMplsGrePopulator.java | 2 +- .../impl/L3vpnOverVxlanPopulator.java | 2 +- .../populator/impl/L3vpnPopulator.java | 21 +- .../OSGI-INF/blueprint/vpnmanager.xml | 4 +- .../intervpnlink/InterVpnLinkLocatorTest.java | 38 +- .../intervpnlink/InterVpnLinkTestCatalog.java | 42 +- .../test/SubnetOpDpnManagerTest.java | 25 +- .../vpnmanager/test/VpnServiceTest.java | 2 +- .../test/VpnSubnetRouteHandlerTest.java | 18 +- .../netvirt/vpnmanager/shell/ShowVpn.java | 10 +- .../shell/ShowVpnInstanceOpData.java | 10 +- .../OSGI-INF/blueprint/blueprint.xml | 2 +- 382 files changed, 4672 insertions(+), 4516 deletions(-) delete mode 100644 elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeDataListener.java diff --git a/aclservice/impl/pom.xml b/aclservice/impl/pom.xml index 30ee2d3510..5ba30f84bc 100644 --- a/aclservice/impl/pom.xml +++ b/aclservice/impl/pom.xml @@ -35,9 +35,13 @@ and is available at http://www.eclipse.org/legal/epl-v10.html org.opendaylight.controller sal-binding-api - + + + org.opendaylight.mdsal + mdsal-binding-dom-adapter org.opendaylight.genius @@ -128,11 +132,17 @@ and is available at http://www.eclipse.org/legal/epl-v10.html testutils test - + + + org.opendaylight.mdsal + mdsal-binding-dom-adapter + test + test-jar org.opendaylight.mdsal diff --git a/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/AbstractAclServiceImpl.java b/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/AbstractAclServiceImpl.java index 3e322cf388..23d4193a1d 100644 --- a/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/AbstractAclServiceImpl.java +++ b/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/AbstractAclServiceImpl.java @@ -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; diff --git a/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/AclServiceImplFactory.java b/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/AclServiceImplFactory.java index f3e3af62fa..06a6729075 100644 --- a/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/AclServiceImplFactory.java +++ b/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/AclServiceImplFactory.java @@ -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; diff --git a/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/EgressAclServiceImpl.java b/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/EgressAclServiceImpl.java index 3ac7e2d37b..679b3b1ac5 100644 --- a/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/EgressAclServiceImpl.java +++ b/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/EgressAclServiceImpl.java @@ -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; diff --git a/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/IngressAclServiceImpl.java b/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/IngressAclServiceImpl.java index 9b0c3a00b1..0e7d104701 100644 --- a/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/IngressAclServiceImpl.java +++ b/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/IngressAclServiceImpl.java @@ -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; diff --git a/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclElanInterfaceListener.java b/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclElanInterfaceListener.java index e1b1d92605..ac637823ba 100644 --- a/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclElanInterfaceListener.java +++ b/aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclElanInterfaceListener.java @@ -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 +public class AclElanInterfaceListener extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener, RecoverableListener { private static final Logger LOG = LoggerFactory.getLogger(AclElanInterfaceListener.class); @@ -43,7 +44,9 @@ public class AclElanInterfaceListener extends AsyncDataTreeChangeListenerBase getWildCardPath() { - return InstanceIdentifier.create(ElanInterfaces.class).child(ElanInterface.class); + public void deregisterListener() { + super.close(); } @Override - protected void remove(InstanceIdentifier key, ElanInterface dataObjectModification) { + public void remove(InstanceIdentifier key, ElanInterface dataObjectModification) { // do nothing } @Override - protected void update(InstanceIdentifier key, ElanInterface dataObjectModificationBefore, + public void update(InstanceIdentifier key, ElanInterface dataObjectModificationBefore, ElanInterface dataObjectModificationAfter) { // do nothing } @Override - protected void add(InstanceIdentifier key, ElanInterface elanInterface) { + public void add(InstanceIdentifier 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 implements +public class AclEventListener extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener, RecoverableListener { private static final Logger LOG = LoggerFactory.getLogger(AclEventListener.class); @@ -65,7 +66,9 @@ public class AclEventListener extends AsyncDataTreeChangeListenerBase getWildCardPath() { - return InstanceIdentifier.create(AccessLists.class).child(Acl.class); + public void deregisterListener() { + super.close(); } @Override - protected void remove(InstanceIdentifier key, Acl acl) { + public void remove(InstanceIdentifier 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 key, Acl aclBefore, Acl aclAfter) { + public void update(InstanceIdentifier key, Acl aclBefore, Acl aclAfter) { String aclName = aclAfter.getAclName(); Collection interfacesBefore = ImmutableSet.copyOf(aclDataUtil.getInterfaceList(new Uuid(aclName))); @@ -160,7 +160,7 @@ public class AclEventListener extends AsyncDataTreeChangeListenerBase key, Acl acl) { + public void add(InstanceIdentifier key, Acl acl) { LOG.trace("On add event, add ACL: {}", acl); this.aclDataUtil.addAcl(acl); @@ -248,11 +248,6 @@ public class AclEventListener extends AsyncDataTreeChangeListenerBase getChangedAceList(Acl updatedAcl, Acl currentAcl) { if (updatedAcl == null) { return Collections.emptyList(); @@ -288,4 +283,11 @@ public class AclEventListener extends AsyncDataTreeChangeListenerBase +public class AclInterfaceListener extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener, RecoverableListener { private static final Logger LOG = LoggerFactory.getLogger(AclInterfaceListener.class); @@ -54,7 +55,9 @@ public class AclInterfaceListener extends AsyncDataTreeChangeListenerBase getWildCardPath() { - return InstanceIdentifier.create(Interfaces.class).child(Interface.class); + public void deregisterListener() { + super.close(); } @Override @@ -251,7 +251,9 @@ public class AclInterfaceListener extends AsyncDataTreeChangeListenerBase implements ClusteredDataTreeChangeListener, RecoverableListener { +public class AclInterfaceStateListener extends AbstractAsyncDataTreeChangeListener + implements ClusteredDataTreeChangeListener, RecoverableListener { private static final Logger LOG = LoggerFactory.getLogger(AclInterfaceStateListener.class); @@ -60,7 +61,9 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase getWildCardPath() { - return InstanceIdentifier.create(InterfacesState.class).child(Interface.class); + public void deregisterListener() { + super.close(); } @Override - protected void remove(InstanceIdentifier key, Interface deleted) { + public void remove(InstanceIdentifier key, Interface deleted) { if (!L2vlan.class.equals(deleted.getType())) { return; } @@ -119,7 +119,7 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase key, Interface before, Interface after) { + public void update(InstanceIdentifier 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 key, Interface added) { + public void add(InstanceIdentifier key, Interface added) { if (!L2vlan.class.equals(added.getType())) { return; } @@ -192,7 +192,9 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase +public class AclNodeListener extends AbstractAsyncDataTreeChangeListener implements RecoverableListener { private static final Logger LOG = LoggerFactory.getLogger(AclNodeListener.class); @@ -63,7 +64,9 @@ public class AclNodeListener extends AsyncDataTreeChangeListenerBase getWildCardPath() { - return InstanceIdentifier.create(Nodes.class).child(Node.class).augmentation(FlowCapableNode.class); + public void deregisterListener() { + super.close(); } @Override - protected void remove(InstanceIdentifier key, FlowCapableNode dataObjectModification) { + public void remove(InstanceIdentifier key, FlowCapableNode dataObjectModification) { // do nothing } @Override - protected void update(InstanceIdentifier key, FlowCapableNode dataObjectModificationBefore, + public void update(InstanceIdentifier key, FlowCapableNode dataObjectModificationBefore, FlowCapableNode dataObjectModificationAfter) { // do nothing } @Override - protected void add(InstanceIdentifier key, FlowCapableNode dataObjectModification) { + public void add(InstanceIdentifier 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 Optional read( DataBroker broker, LogicalDatastoreType datastoreType, InstanceIdentifier 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 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 elanInterfaceId = getElanInterfaceConfigurationDataPathId(elanInterfaceName); - return read(broker, LogicalDatastoreType.CONFIGURATION, elanInterfaceId).orNull(); + return read(broker, LogicalDatastoreType.CONFIGURATION, elanInterfaceId).orElse(null); } public static InstanceIdentifier getElanInterfaceConfigurationDataPathId(String interfaceName) { @@ -703,7 +703,7 @@ public final class AclServiceUtils { @Nullable public static ElanInstance getElanInstanceByName(String elanInstanceName, DataBroker broker) { InstanceIdentifier elanIdentifierId = getElanInstanceConfigurationDataPath(elanInstanceName); - return read(broker, LogicalDatastoreType.CONFIGURATION, elanIdentifierId).orNull(); + return read(broker, LogicalDatastoreType.CONFIGURATION, elanIdentifierId).orElse(null); } public static InstanceIdentifier getElanInstanceConfigurationDataPath(String elanInstanceName) { @@ -1120,9 +1120,9 @@ public final class AclServiceUtils { @Nullable private AclPortsByIp getAclPortsByIpFromOperDs(String aclName) { InstanceIdentifier 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 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; } diff --git a/aclservice/impl/src/main/resources/OSGI-INF/blueprint/aclservice.xml b/aclservice/impl/src/main/resources/OSGI-INF/blueprint/aclservice.xml index 690f75a675..c34c670cbb 100644 --- a/aclservice/impl/src/main/resources/OSGI-INF/blueprint/aclservice.xml +++ b/aclservice/impl/src/main/resources/OSGI-INF/blueprint/aclservice.xml @@ -5,7 +5,7 @@ odl:use-default-for-reference-types="true"> + interface="org.opendaylight.mdsal.binding.api.DataBroker" /> true); diff --git a/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/IdentifiedAceBuilder.java b/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/IdentifiedAceBuilder.java index bcacccf869..aac77b38c2 100644 --- a/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/IdentifiedAceBuilder.java +++ b/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/IdentifiedAceBuilder.java @@ -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; diff --git a/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/IdentifiedInterfaceWithAclBuilder.java b/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/IdentifiedInterfaceWithAclBuilder.java index ae7b5850d6..85e5dd6913 100644 --- a/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/IdentifiedInterfaceWithAclBuilder.java +++ b/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/IdentifiedInterfaceWithAclBuilder.java @@ -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; diff --git a/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/StateInterfaceBuilderHelper.java b/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/StateInterfaceBuilderHelper.java index 931c3335f0..31d59c5744 100644 --- a/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/StateInterfaceBuilderHelper.java +++ b/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/StateInterfaceBuilderHelper.java @@ -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; diff --git a/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/infra/DataBrokerPairsUtil.java b/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/infra/DataBrokerPairsUtil.java index b660840910..fbe29794ef 100644 --- a/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/infra/DataBrokerPairsUtil.java +++ b/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/infra/DataBrokerPairsUtil.java @@ -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; diff --git a/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/infra/DataTreeIdentifierDataObjectPairBuilder.java b/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/infra/DataTreeIdentifierDataObjectPairBuilder.java index d2e938dff9..28a8b03a14 100644 --- a/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/infra/DataTreeIdentifierDataObjectPairBuilder.java +++ b/aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/infra/DataTreeIdentifierDataObjectPairBuilder.java @@ -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 @Override default Pair, T> build() { - return Pair.of(new DataTreeIdentifier<>(type(), identifier()), dataObject()); + return Pair.of(DataTreeIdentifier.create(type(), identifier()), dataObject()); } } diff --git a/bgpmanager/impl/pom.xml b/bgpmanager/impl/pom.xml index 888b077ec3..fc334b2d79 100644 --- a/bgpmanager/impl/pom.xml +++ b/bgpmanager/impl/pom.xml @@ -66,7 +66,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html vpnmanager-api ${project.version} - + + + org.opendaylight.mdsal + mdsal-binding-dom-adapter + test + + + org.opendaylight.mdsal + mdsal-binding-dom-adapter + test + test-jar org.apache.karaf.shell diff --git a/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpConfigurationManager.java b/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpConfigurationManager.java index 926fe55528..7df679c3a5 100755 --- a/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpConfigurationManager.java +++ b/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpConfigurationManager.java @@ -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 + extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 iid, ConfigServer val) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(ConfigServer.class); - } - - @Override - protected void remove(InstanceIdentifier iid, ConfigServer val) { + public void remove(InstanceIdentifier 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 iid, + public void update(InstanceIdentifier 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 + public class AsIdReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 iid, AsId val) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(AsId.class); - } - - @Override - protected void remove(InstanceIdentifier iid, AsId val) { + public void remove(InstanceIdentifier 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 iid, + public void update(InstanceIdentifier iid, AsId oldval, AsId newval) { if (!isBGPEntityOwner()) { return; @@ -700,18 +684,20 @@ public class BgpConfigurationManager implements EbgpService { } } - public class GracefulRestartReactor - extends AsyncDataTreeChangeListenerBase + public class GracefulRestartReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 iid, GracefulRestart val) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(GracefulRestart.class); - } - - @Override - protected void remove(InstanceIdentifier iid, GracefulRestart val) { + public void remove(InstanceIdentifier iid, GracefulRestart val) { if (!isBGPEntityOwner()) { return; } @@ -763,7 +739,7 @@ public class BgpConfigurationManager implements EbgpService { } @Override - protected void update(InstanceIdentifier iid, + public void update(InstanceIdentifier iid, GracefulRestart oldval, GracefulRestart newval) { if (!isBGPEntityOwner()) { return; @@ -786,18 +762,20 @@ public class BgpConfigurationManager implements EbgpService { } } - public class LoggingReactor - extends AsyncDataTreeChangeListenerBase + public class LoggingReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 iid, Logging val) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(Logging.class); - } - - @Override - protected void remove(InstanceIdentifier iid, Logging val) { + public void remove(InstanceIdentifier iid, Logging val) { if (!isBGPEntityOwner()) { return; } @@ -848,7 +816,7 @@ public class BgpConfigurationManager implements EbgpService { } @Override - protected void update(InstanceIdentifier iid, + public void update(InstanceIdentifier iid, Logging oldval, Logging newval) { if (!isBGPEntityOwner()) { return; @@ -869,18 +837,20 @@ public class BgpConfigurationManager implements EbgpService { } } - public class NeighborsReactor - extends AsyncDataTreeChangeListenerBase + public class NeighborsReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 iid, Neighbors val) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class); - } - - @Override - protected void remove(InstanceIdentifier iid, Neighbors val) { + public void remove(InstanceIdentifier 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 iid, + public void update(InstanceIdentifier iid, Neighbors oldval, Neighbors newval) { if (!isBGPEntityOwner()) { return; @@ -986,18 +946,20 @@ public class BgpConfigurationManager implements EbgpService { } } - public class EbgpMultihopReactor - extends AsyncDataTreeChangeListenerBase + public class EbgpMultihopReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 iid, EbgpMultihop val) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class) - .child(EbgpMultihop.class); - } - - @Override - protected void remove(InstanceIdentifier iid, EbgpMultihop val) { + public void remove(InstanceIdentifier iid, EbgpMultihop val) { if (!isBGPEntityOwner()) { return; } @@ -1052,7 +1003,7 @@ public class BgpConfigurationManager implements EbgpService { } @Override - protected void update(InstanceIdentifier iid, + public void update(InstanceIdentifier iid, EbgpMultihop oldval, EbgpMultihop newval) { if (!isBGPEntityOwner()) { return; @@ -1061,18 +1012,20 @@ public class BgpConfigurationManager implements EbgpService { } } - public class UpdateSourceReactor - extends AsyncDataTreeChangeListenerBase + public class UpdateSourceReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 iid, UpdateSource val) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class) - .child(UpdateSource.class); - } - - @Override - protected void remove(InstanceIdentifier iid, UpdateSource val) { + public void remove(InstanceIdentifier iid, UpdateSource val) { if (!isBGPEntityOwner()) { return; } @@ -1127,7 +1069,7 @@ public class BgpConfigurationManager implements EbgpService { } @Override - protected void update(InstanceIdentifier iid, + public void update(InstanceIdentifier iid, UpdateSource oldval, UpdateSource newval) { if (!isBGPEntityOwner()) { return; @@ -1136,18 +1078,20 @@ public class BgpConfigurationManager implements EbgpService { } } - public class AddressFamiliesReactor - extends AsyncDataTreeChangeListenerBase + public class AddressFamiliesReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 iid, AddressFamilies val) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class) - .child(AddressFamilies.class); - } - - @Override - protected void remove(InstanceIdentifier iid, AddressFamilies val) { + public void remove(InstanceIdentifier iid, AddressFamilies val) { if (!isBGPEntityOwner()) { return; } @@ -1206,7 +1139,7 @@ public class BgpConfigurationManager implements EbgpService { } @Override - protected void update(InstanceIdentifier iid, + public void update(InstanceIdentifier iid, AddressFamilies oldval, AddressFamilies newval) { if (!isBGPEntityOwner()) { return; @@ -1215,23 +1148,19 @@ public class BgpConfigurationManager implements EbgpService { } } - public class NetworksReactor - extends AsyncDataTreeChangeListenerBase + public class NetworksReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 iid, Networks val) { + public void add(InstanceIdentifier iid, Networks val) { if (!isBGPEntityOwner()) { return; } @@ -1271,12 +1200,7 @@ public class BgpConfigurationManager implements EbgpService { } @Override - protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(NetworksContainer.class).child(Networks.class); - } - - @Override - protected void remove(InstanceIdentifier iid, Networks val) { + public void remove(InstanceIdentifier iid, Networks val) { if (!isBGPEntityOwner()) { return; } @@ -1323,7 +1247,7 @@ public class BgpConfigurationManager implements EbgpService { @Override - protected void update(final InstanceIdentifier iid, + public void update(final InstanceIdentifier 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 + public class VrfsReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 iid, Vrfs vrfs) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(VrfsContainer.class).child(Vrfs.class); - } - - @Override - protected void remove(InstanceIdentifier iid, Vrfs val) { + public void remove(InstanceIdentifier iid, Vrfs val) { if (!isBGPEntityOwner()) { return; } @@ -1445,7 +1361,7 @@ public class BgpConfigurationManager implements EbgpService { } @Override - protected void update(InstanceIdentifier iid, + public void update(InstanceIdentifier 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 + public class BgpReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 iid, Bgp val) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(Bgp.class); - } - - @Override - protected void remove(InstanceIdentifier iid, Bgp val) { + public void remove(InstanceIdentifier iid, Bgp val) { if (!isBGPEntityOwner()) { return; } @@ -1562,7 +1468,7 @@ public class BgpConfigurationManager implements EbgpService { } @Override - protected void update(InstanceIdentifier iid, + public void update(InstanceIdentifier iid, Bgp oldval, Bgp newval) { if (!isBGPEntityOwner()) { return; @@ -1573,39 +1479,30 @@ public class BgpConfigurationManager implements EbgpService { } @SuppressWarnings("deprecation") - public class MultipathReactor - extends AsyncDataTreeChangeListenerBase + public class MultipathReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(MultipathContainer.class).child(Multipath.class); - } - - @Override - protected void remove(InstanceIdentifier iid, Multipath val) { + public void remove(InstanceIdentifier iid, Multipath val) { executor.execute(new MultipathStatusChange(val)); } @Override - protected void update(InstanceIdentifier iid, Multipath oldval, Multipath newval) { + public void update(InstanceIdentifier iid, Multipath oldval, Multipath newval) { executor.execute(new MultipathStatusChange(newval)); } @Override - protected void add(InstanceIdentifier key, Multipath dataObjectModification) { + public void add(InstanceIdentifier key, Multipath dataObjectModification) { executor.execute(new MultipathStatusChange(dataObjectModification)); } @@ -1651,25 +1548,16 @@ public class BgpConfigurationManager implements EbgpService { } @SuppressWarnings("deprecation") - public class VrfMaxpathReactor - extends AsyncDataTreeChangeListenerBase + public class VrfMaxpathReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { private static final String YANG_OBJ = "vrfMaxpath "; public VrfMaxpathReactor() { - super(VrfMaxpath.class, VrfMaxpathReactor.class); - } - - - @Override - protected VrfMaxpathReactor getDataTreeChangeListener() { - return VrfMaxpathReactor.this; - } - - @Override - protected InstanceIdentifier 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 iid, VrfMaxpath vrfMaxPathVal) { + public void remove(InstanceIdentifier 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 iid, + public void update(InstanceIdentifier 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 instanceIdentifier, VrfMaxpath vrfMaxpathVal) { + public void add(InstanceIdentifier instanceIdentifier, VrfMaxpath vrfMaxpathVal) { executor.execute(new VrfMaxPathConfigurator(vrfMaxpathVal)); } @@ -1735,18 +1623,19 @@ public class BgpConfigurationManager implements EbgpService { } } - public class BfdConfigReactor - extends AsyncDataTreeChangeListenerBase + public class BfdConfigReactor extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { 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 iid, BfdConfig val) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(BfdConfig.class); - } - - @Override - protected void remove(InstanceIdentifier iid, BfdConfig val) { + public void remove(InstanceIdentifier iid, BfdConfig val) { if (!isBGPEntityOwner()) { return; } @@ -1805,7 +1684,7 @@ public class BgpConfigurationManager implements EbgpService { } @Override - protected void update(InstanceIdentifier iid, + public void update(InstanceIdentifier 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 id = InstanceIdentifier.create(Bgp.class).child(GracefulRestart.class); - Optional gracefulRestartOptional = MDSALUtil.read(dataBroker, + Optional 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); diff --git a/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpManager.java b/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpManager.java index b0cde0dd25..40d45ad515 100644 --- a/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpManager.java +++ b/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpManager.java @@ -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>() { @Override diff --git a/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpUtil.java b/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpUtil.java index 245850e44e..a412f8c654 100755 --- a/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpUtil.java +++ b/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpUtil.java @@ -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 id = getVpnInstanceOpDataIdentifier(rd); - Optional vpnInstanceOpData = MDSALUtil.read(dataBroker, - LogicalDatastoreType.OPERATIONAL, id); + Optional 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 id = getEvpnRdToNetworkIdentifier(rd); - Optional evpnRdToNetworkOpData = MDSALUtil.read(dataBroker, - LogicalDatastoreType.CONFIGURATION, id); + Optional 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 id = InstanceIdentifier.create(Bgp.class) .child(VrfsContainer.class) .child(Vrfs.class, new VrfsKey(rd)); - Optional vrfsFromDs = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id); + Optional 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 id = InstanceIdentifier.builder(BfdConfig.class).build(); - Optional bfdConfigOptional = MDSALUtil.read(dataBroker, - LogicalDatastoreType.CONFIGURATION, id); + Optional 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 id = InstanceIdentifier.builder(Bgp.class).child(DcgwTepList.class).build(); - Optional dcgwTepListOptional = MDSALUtil.read(dataBroker, - LogicalDatastoreType.CONFIGURATION, id); + Optional 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 tepListOptional = MDSALUtil.read(dataBroker, - LogicalDatastoreType.CONFIGURATION, id); + Optional 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(); } diff --git a/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/EvpnRdNetworkListener.java b/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/EvpnRdNetworkListener.java index e3ce4494e6..aa2f0ac5d4 100644 --- a/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/EvpnRdNetworkListener.java +++ b/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/EvpnRdNetworkListener.java @@ -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 +public class EvpnRdNetworkListener extends AbstractAsyncDataTreeChangeListener implements ClusteredDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(EvpnRdNetworkListener.class); @@ -30,29 +33,21 @@ public class EvpnRdNetworkListener extends AsyncDataTreeChangeListenerBase 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 instanceIdentifier, EvpnRdToNetwork rdToNetwork) { + public void add(InstanceIdentifier instanceIdentifier, EvpnRdToNetwork rdToNetwork) { if (!bgpConfigManager.isBGPEntityOwner()) { return; } @@ -63,7 +58,7 @@ public class EvpnRdNetworkListener extends AsyncDataTreeChangeListenerBase instanceIdentifier, EvpnRdToNetwork rdToNetwork, + public void update(InstanceIdentifier instanceIdentifier, EvpnRdToNetwork rdToNetwork, EvpnRdToNetwork rdToNetworkOld) { String rd = rdToNetwork.getRd(); String elanName = rdToNetwork.getNetworkId(); @@ -73,7 +68,7 @@ public class EvpnRdNetworkListener extends AsyncDataTreeChangeListenerBase instanceIdentifier, EvpnRdToNetwork rdToNetwork) { + public void remove(InstanceIdentifier instanceIdentifier, EvpnRdToNetwork rdToNetwork) { if (!bgpConfigManager.isBGPEntityOwner()) { return; } @@ -96,4 +91,11 @@ public class EvpnRdNetworkListener extends AsyncDataTreeChangeListenerBase diff --git a/bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/AbstractMockFibManager.java b/bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/AbstractMockFibManager.java index 1b0b8ab724..4de34e6e10 100644 --- a/bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/AbstractMockFibManager.java +++ b/bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/AbstractMockFibManager.java @@ -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 implements DataTreeChangeListener { diff --git a/bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/BgpManagerTest.java b/bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/BgpManagerTest.java index 975fadc7ad..f7295962d0 100644 --- a/bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/BgpManagerTest.java +++ b/bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/BgpManagerTest.java @@ -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; diff --git a/bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/MockFibManager.java b/bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/MockFibManager.java index f4da5c6bb8..6e567645e3 100644 --- a/bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/MockFibManager.java +++ b/bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/MockFibManager.java @@ -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 { registerListener(db) ; } - private void registerListener(final DataBroker db) { + public void registerListener(final DataBroker db) { final DataTreeIdentifier treeId = - new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, getWildCardPath()); + DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, getWildCardPath()); listenerRegistration = db.registerDataTreeChangeListener(treeId, MockFibManager.this); } diff --git a/cloud-servicechain/impl/pom.xml b/cloud-servicechain/impl/pom.xml index f40be0f5e2..61c3387ced 100644 --- a/cloud-servicechain/impl/pom.xml +++ b/cloud-servicechain/impl/pom.xml @@ -29,9 +29,13 @@ javax.inject true - + + + org.opendaylight.mdsal + mdsal-binding-dom-adapter org.opendaylight.genius diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/ElanServiceChainHandler.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/ElanServiceChainHandler.java index 5948e1d948..df118f2481 100755 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/ElanServiceChainHandler.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/ElanServiceChainHandler.java @@ -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; diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/VPNServiceChainHandler.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/VPNServiceChainHandler.java index f964fa1c04..40a38ca16e 100755 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/VPNServiceChainHandler.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/VPNServiceChainHandler.java @@ -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 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); diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/AddVpnPseudoPortDataJob.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/AddVpnPseudoPortDataJob.java index 71bfd50e41..721e41d2de 100644 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/AddVpnPseudoPortDataJob.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/AddVpnPseudoPortDataJob.java @@ -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; diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/RemoveVpnPseudoPortDataJob.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/RemoveVpnPseudoPortDataJob.java index 6af40fd720..5f22bdfb7d 100644 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/RemoveVpnPseudoPortDataJob.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/RemoveVpnPseudoPortDataJob.java @@ -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; diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/VpnPseudoPortDataBaseJob.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/VpnPseudoPortDataBaseJob.java index dfe7878509..71c51dfe65 100644 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/VpnPseudoPortDataBaseJob.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/VpnPseudoPortDataBaseJob.java @@ -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>> { +public abstract class VpnPseudoPortDataBaseJob implements Callable>> { final ManagedNewTransactionRunner txRunner; protected final String vpnRd; diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/CloudScVpnInterfaceListener.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/CloudScVpnInterfaceListener.java index 12e44d3a5d..f948471db4 100644 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/CloudScVpnInterfaceListener.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/CloudScVpnInterfaceListener.java @@ -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); } } diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/ElanDpnInterfacesListener.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/ElanDpnInterfacesListener.java index de0384ff44..a7752ee2e5 100755 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/ElanDpnInterfacesListener.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/ElanDpnInterfacesListener.java @@ -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; diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnPseudoPortListener.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnPseudoPortListener.java index 92f76c7fbc..a6ad4c96a6 100755 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnPseudoPortListener.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnPseudoPortListener.java @@ -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; diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnToDpnListener.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnToDpnListener.java index ec0d036c68..dbd81f6d30 100644 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnToDpnListener.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnToDpnListener.java @@ -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); } } diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnToElanFallbackNodeListener.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnToElanFallbackNodeListener.java index 913dbd6673..037d0df68c 100644 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnToElanFallbackNodeListener.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnToElanFallbackNodeListener.java @@ -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; diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VrfListener.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VrfListener.java index 9d0aec0e26..fdf922689b 100644 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VrfListener.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VrfListener.java @@ -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; diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/ElanServiceChainUtils.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/ElanServiceChainUtils.java index 677fb430de..90ca4c0ed5 100755 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/ElanServiceChainUtils.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/ElanServiceChainUtils.java @@ -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 getElanServiceChainState(final DataBroker broker, diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/VpnPseudoPortCache.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/VpnPseudoPortCache.java index 1960556c73..2ce54f9074 100755 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/VpnPseudoPortCache.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/VpnPseudoPortCache.java @@ -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); } } diff --git a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/VpnServiceChainUtils.java b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/VpnServiceChainUtils.java index b2108d91f5..e0834c51b2 100755 --- a/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/VpnServiceChainUtils.java +++ b/cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/VpnServiceChainUtils.java @@ -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(); } diff --git a/cloud-servicechain/impl/src/main/resources/OSGI-INF/blueprint/cloud-servicechain.xml b/cloud-servicechain/impl/src/main/resources/OSGI-INF/blueprint/cloud-servicechain.xml index 69c104b9da..fd9d1a2210 100644 --- a/cloud-servicechain/impl/src/main/resources/OSGI-INF/blueprint/cloud-servicechain.xml +++ b/cloud-servicechain/impl/src/main/resources/OSGI-INF/blueprint/cloud-servicechain.xml @@ -3,7 +3,7 @@ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0" odl:use-default-for-reference-types="true"> - diff --git a/cloud-servicechain/impl/src/test/java/org/opendaylight/netvirt/cloudservicechain/VPNServiceChainHandlerTest.java b/cloud-servicechain/impl/src/test/java/org/opendaylight/netvirt/cloudservicechain/VPNServiceChainHandlerTest.java index ef4e1be3ef..6f486596fa 100755 --- a/cloud-servicechain/impl/src/test/java/org/opendaylight/netvirt/cloudservicechain/VPNServiceChainHandlerTest.java +++ b/cloud-servicechain/impl/src/test/java/org/opendaylight/netvirt/cloudservicechain/VPNServiceChainHandlerTest.java @@ -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 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, 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, ReadFailedException> chkdFuture = mock(CheckedFuture.class); - when(chkdFuture.checkedGet()).thenReturn(Optional.absent()); + when(chkdFuture.get()).thenReturn(Optional.empty()); InstanceIdentifier 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); diff --git a/dhcpservice/impl/pom.xml b/dhcpservice/impl/pom.xml index fd4e294bda..f41e672204 100644 --- a/dhcpservice/impl/pom.xml +++ b/dhcpservice/impl/pom.xml @@ -36,10 +36,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html org.apache.karaf.shell.console provided - + org.opendaylight.mdsal mdsal-eos-binding-api diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpAllocationPoolListener.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpAllocationPoolListener.java index 35ace802c7..79bd80ef22 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpAllocationPoolListener.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpAllocationPoolListener.java @@ -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 { +public class DhcpAllocationPoolListener extends AbstractAsyncDataTreeChangeListener { 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 key, AllocationPool dataObjectModification) { + public void add(InstanceIdentifier key, AllocationPool dataObjectModification) { String networkId = key.firstKeyOf(Network.class).getNetworkId(); dhcpAllocationPoolManager.createIdAllocationPool(networkId, dataObjectModification); Map> elanDpnInterfacesByName = @@ -67,18 +69,7 @@ public class DhcpAllocationPoolListener } @Override - protected DhcpAllocationPoolListener getDataTreeChangeListener() { - return this; - } - - @Override - protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.builder(DhcpAllocationPool.class)// - .child(Network.class).child(AllocationPool.class).build(); - } - - @Override - protected void remove(InstanceIdentifier key, AllocationPool dataObjectModification) { + public void remove(InstanceIdentifier key, AllocationPool dataObjectModification) { String networkId = key.firstKeyOf(Network.class).getNetworkId(); dhcpAllocationPoolManager.releaseIdAllocationPool(networkId, dataObjectModification); Map> elanDpnInterfacesByName = @@ -91,9 +82,16 @@ public class DhcpAllocationPoolListener } @Override - protected void update(InstanceIdentifier key, AllocationPool dataObjectModificationBefore, + public void update(InstanceIdentifier key, AllocationPool dataObjectModificationBefore, AllocationPool dataObjectModificationAfter) { // TODO Auto-generated method stub } + + @Override + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); + } } diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpAllocationPoolManager.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpAllocationPoolManager.java index 453fa80f16..15c93189bc 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpAllocationPoolManager.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpAllocationPoolManager.java @@ -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 = InstanceIdentifier.builder(DhcpAllocationPool.class) .child(Network.class, new NetworkKey(networkId)).build(); Optional optionalNetworkConfData = SingleTransactionDataBroker.syncReadOptional(dataBroker, @@ -136,8 +134,15 @@ public class DhcpAllocationPoolManager implements AutoCloseable, EventListener { public Map> getElanDpnInterfacesByName(DataBroker broker, String elanInstanceName) { InstanceIdentifier elanDpnIfacesIid = InstanceIdentifier.builder(ElanDpnInterfaces.class) .child(ElanDpnInterfacesList.class, new ElanDpnInterfacesListKey(elanInstanceName)).build(); - Optional elanDpnIfacesOpc = MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, - elanDpnIfacesIid); + Optional 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 elanInterfaceName = InstanceIdentifier.builder(ElanInterfaces.class) .child(ElanInterface.class, new ElanInterfaceKey(portUuid)).build(); Optional optionalElanInterface = SingleTransactionDataBroker.syncReadOptional(dataBroker, diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpConfigListener.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpConfigListener.java index 3267c0de68..14d13f2a76 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpConfigListener.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpConfigListener.java @@ -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 { +public class DhcpConfigListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 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 identifier, DhcpConfig del) { + public void remove(InstanceIdentifier identifier, DhcpConfig del) { LOG.trace("DhcpConfig removed: {}", del); updateConfig(null); } @Override - protected void update(InstanceIdentifier identifier, DhcpConfig original, DhcpConfig update) { + public void update(InstanceIdentifier identifier, DhcpConfig original, DhcpConfig update) { LOG.trace("DhcpConfig changed to {}", update); updateConfig(update); } @Override - protected void add(InstanceIdentifier identifier, DhcpConfig add) { + public void add(InstanceIdentifier 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; - } } diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpDesignatedDpnListener.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpDesignatedDpnListener.java index 188f9461ce..0078cf1a48 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpDesignatedDpnListener.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpDesignatedDpnListener.java @@ -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 { +public class DhcpDesignatedDpnListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 identifier, DesignatedSwitchForTunnel del) { + public void remove(InstanceIdentifier 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 identifier, DesignatedSwitchForTunnel original, + public void update(InstanceIdentifier 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 identifier, DesignatedSwitchForTunnel add) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(DesignatedSwitchesForExternalTunnels.class) - .child(DesignatedSwitchForTunnel.class); - } - - @Override - protected DhcpDesignatedDpnListener getDataTreeChangeListener() { - return DhcpDesignatedDpnListener.this; - } } diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpExternalTunnelManager.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpExternalTunnelManager.java index bf49cab290..32437129b5 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpExternalTunnelManager.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpExternalTunnelManager.java @@ -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 instanceIdentifier = InstanceIdentifier.builder(DesignatedSwitchesForExternalTunnels.class).build(); - Optional designatedSwitchForTunnelOptional = - MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, instanceIdentifier); + Optional 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 list = designatedSwitchForTunnelOptional.get().nonnullDesignatedSwitchForTunnel(); @@ -197,7 +203,14 @@ public class DhcpExternalTunnelManager implements IDhcpExternalTunnelManager { } LOG.trace("Loading vniMacAddressToPortCache"); InstanceIdentifier inst = InstanceIdentifier.builder(Neutron.class).child(Ports.class).build(); - Optional optionalPorts = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst); + Optional 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 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 designatedSwitchForTunnelOptional = - MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, instanceIdentifier); + Optional 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 instanceIdentifier = InstanceIdentifier.builder(DesignatedSwitchesForExternalTunnels.class).build(); - Optional designatedSwitchForTunnelOptional = - MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, instanceIdentifier); + Optional 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 list = designatedSwitchForTunnelOptional.get().nonnullDesignatedSwitchForTunnel(); @@ -837,13 +864,13 @@ public class DhcpExternalTunnelManager implements IDhcpExternalTunnelManager { .setLogicalSwitchRef(lsRef).build(); InstanceIdentifier 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(); diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpInterfaceConfigListener.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpInterfaceConfigListener.java index e6ac823e21..bc0897a58b 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpInterfaceConfigListener.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpInterfaceConfigListener.java @@ -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 { +public class DhcpInterfaceConfigListener extends AbstractAsyncDataTreeChangeListener { 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 identifier, Interface del) { + public void remove(InstanceIdentifier 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 identifier, Interface original, Interface update) { + public void update(InstanceIdentifier identifier, Interface original, Interface update) { // Handled in update () DhcpInterfaceEventListener } @Override - protected void add(InstanceIdentifier identifier, Interface add) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(Interfaces.class).child(Interface.class); - } - - @Override - protected DhcpInterfaceConfigListener getDataTreeChangeListener() { - return DhcpInterfaceConfigListener.this; - } } diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpInterfaceEventListener.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpInterfaceEventListener.java index 94600b8b1d..fd3515839b 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpInterfaceEventListener.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpInterfaceEventListener.java @@ -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 { +public class DhcpInterfaceEventListener extends AbstractAsyncDataTreeChangeListener { 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 identifier, Interface del) { + public void remove(InstanceIdentifier 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 identifier, + public void update(InstanceIdentifier 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 identifier, Interface add) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(InterfacesState.class).child(Interface.class); - } - - @Override - protected DhcpInterfaceEventListener getDataTreeChangeListener() { - return DhcpInterfaceEventListener.this; - } } diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpL2GwUtil.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpL2GwUtil.java index 5e806ab194..856bf03d44 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpL2GwUtil.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpL2GwUtil.java @@ -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 nodeIid) { - Optional nodeOptional = - MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, nodeIid); - if (!CONTAINS_GLOBAL_AUGMENTATION.test(nodeOptional)) { - return null; - } - List switchIids = nodeOptional.get().augmentation(HwvtepGlobalAugmentation.class).getSwitches(); - if (EMPTY_LIST.test(switchIids)) { - return null; - } - InstanceIdentifier psIid = (InstanceIdentifier) switchIids.get(0).getSwitchRef().getValue(); - nodeOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, psIid); - if (!CONTAINS_SWITCH_AUGMENTATION.test(nodeOptional)) { - return null; - } - List tunnelIps = nodeOptional.get().augmentation(PhysicalSwitchAugmentation.class).getTunnelIps(); - if (EMPTY_LIST.test(tunnelIps)) { + Optional nodeOptional; + try { + nodeOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker, + LogicalDatastoreType.OPERATIONAL, nodeIid); + if (!CONTAINS_GLOBAL_AUGMENTATION.test(nodeOptional)) { + return null; + } + List switchIids = nodeOptional.get().augmentation(HwvtepGlobalAugmentation.class).getSwitches(); + if (EMPTY_LIST.test(switchIids)) { + return null; + } + InstanceIdentifier psIid = (InstanceIdentifier) switchIids.get(0).getSwitchRef().getValue(); + nodeOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL, + psIid); + if (!CONTAINS_SWITCH_AUGMENTATION.test(nodeOptional)) { + return null; + } + List 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(); } } diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpManager.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpManager.java index 54fd5ba4cb..7d77420155 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpManager.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpManager.java @@ -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 inst = InstanceIdentifier.create(Neutron.class).child(Subnets.class).child(Subnet .class, new SubnetKey(subnetId)); - Optional sn = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst); + Optional 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 inst = InstanceIdentifier.create(Neutron.class).child(Ports.class).child(Port.class, new PortKey(new Uuid(name))); - Optional port = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst); + Optional 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(); } diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpMcastMacListener.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpMcastMacListener.java index 8ff9e81fbf..67fb5f0d4b 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpMcastMacListener.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpMcastMacListener.java @@ -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; diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpNeutronPortListener.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpNeutronPortListener.java index 9e8dd08225..a242c1d350 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpNeutronPortListener.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpNeutronPortListener.java @@ -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 { +public class DhcpNeutronPortListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 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 identifier, Port del) { + public void remove(InstanceIdentifier 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 identifier, Port original, Port update) { + public void update(InstanceIdentifier 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 identifier, Port add) { + public void add(InstanceIdentifier 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. diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpNodeListener.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpNodeListener.java index 42a595a176..2a69cb524a 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpNodeListener.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpNodeListener.java @@ -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 { +public class DhcpNodeListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(Nodes.class).child(Node.class); - } - - @Override - protected void remove(InstanceIdentifier key, Node del) { + public void remove(InstanceIdentifier 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 key, Node dataObjectModificationBefore, + public void update(InstanceIdentifier key, Node dataObjectModificationBefore, Node dataObjectModificationAfter) { } @Override - protected void add(InstanceIdentifier key, Node add) { + public void add(InstanceIdentifier 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 extractDpnsFromNodes(Optional 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 elanDpnInstanceIdentifier = InstanceIdentifier.builder(ElanDpnInterfaces.class) .child(ElanDpnInterfacesList.class, new ElanDpnInterfacesListKey(elanInstanceName)).build(); - Optional elanDpnOptional = - MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, elanDpnInstanceIdentifier); + Optional 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 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 inst = InstanceIdentifier.create(Neutron.class) .child(Networks.class).child(Network.class, new NetworkKey(networkId)); - Optional optionalNetwork = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst); + Optional 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 getSubnetIdsFromNetworkId(DataBroker broker, Uuid networkId) { InstanceIdentifier id = buildNetworkMapIdentifier(networkId); - Optional optionalNetworkMap = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, id); + Optional 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 subnetIdList = optionalNetworkMap.get().getSubnetIdList(); if (subnetIdList != null) { @@ -511,7 +538,15 @@ public final class DhcpServiceUtils { final SubnetKey subnetkey = new SubnetKey(subnetUuid); final InstanceIdentifier subnetidentifier = InstanceIdentifier.create(Neutron.class) .child(Subnets.class).child(Subnet.class, subnetkey); - final Optional subnet = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, subnetidentifier); + final Optional 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 ipVersionBase = subnet.get().getIpVersion(); return IpVersionV4.class.equals(ipVersionBase); diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpSubnetListener.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpSubnetListener.java index f8fb73c599..c371cd0e89 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpSubnetListener.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpSubnetListener.java @@ -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 { +public class DhcpSubnetListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 identifier, Subnet add) { + public void add(InstanceIdentifier identifier, Subnet add) { } @Override - protected void remove(InstanceIdentifier identifier, Subnet del) { + public void remove(InstanceIdentifier identifier, Subnet del) { } @Override - protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(Neutron.class).child(Subnets.class).child(Subnet.class); - } - - @Override - protected void update(InstanceIdentifier identifier, Subnet original, Subnet update) { + public void update(InstanceIdentifier 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 id = InstanceIdentifier.builder(Subnetmaps.class) .child(Subnetmap.class, new SubnetmapKey(subnetId)).build(); - ReadOnlyTransaction tx = broker.newReadOnlyTransaction(); + ReadTransaction tx = broker.newReadOnlyTransaction(); Optional 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; - } } diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpUCastMacListener.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpUCastMacListener.java index de2fc8a649..df8cadea62 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpUCastMacListener.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpUCastMacListener.java @@ -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 { +public class DhcpUCastMacListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 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 identifier, + public void remove(InstanceIdentifier 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 identifier, + public void update(InstanceIdentifier identifier, LocalUcastMacs original, LocalUcastMacs update) { // TODO Auto-generated method stub } @Override - protected void add(InstanceIdentifier identifier, + public void add(InstanceIdentifier identifier, LocalUcastMacs add) { + if (!config.isControllerDhcpEnabled()) { + return; + } NodeId torNodeId = identifier.firstKeyOf(Node.class).getNodeId(); InstanceIdentifier logicalSwitchRef = (InstanceIdentifier) add.getLogicalSwitchRef().getValue(); - Optional logicalSwitchOptional = - MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, logicalSwitchRef); + Optional 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 logicalSwitchRef = (InstanceIdentifier)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; + } } } diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/NodeListener.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/NodeListener.java index 8a9027b66b..c47d8e3420 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/NodeListener.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/NodeListener.java @@ -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 { +public class NodeListener extends AbstractAsyncDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(NodeListener.class); @@ -39,30 +39,29 @@ public class NodeListener extends AsyncDataTreeChangeListenerBase identifier, Node del) { + public void remove(InstanceIdentifier identifier, Node del) { } @Override - protected void update(InstanceIdentifier identifier, Node original, Node update) { + public void update(InstanceIdentifier identifier, Node original, Node update) { } @Override - protected void add(InstanceIdentifier identifier, Node add) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(Nodes.class).child(Node.class); - } - - @Override - protected NodeListener getDataTreeChangeListener() { - return NodeListener.this; - } } diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpAllocationPoolAddJob.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpAllocationPoolAddJob.java index 06ca214c3b..e5ad1861da 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpAllocationPoolAddJob.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpAllocationPoolAddJob.java @@ -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>> { +public class DhcpAllocationPoolAddJob implements Callable>> { private final ManagedNewTransactionRunner txRunner; private final String interfaceName; diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpAllocationPoolRemoveJob.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpAllocationPoolRemoveJob.java index 3aff1a0c10..df4c798a89 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpAllocationPoolRemoveJob.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpAllocationPoolRemoveJob.java @@ -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>> { +public class DhcpAllocationPoolRemoveJob implements Callable>> { private final ManagedNewTransactionRunner txRunner; private final String interfaceName; diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceAddJob.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceAddJob.java index defb8469f8..b85a9d575a 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceAddJob.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceAddJob.java @@ -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>> { +public class DhcpInterfaceAddJob implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(DhcpInterfaceAddJob.class); diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceRemoveJob.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceRemoveJob.java index 3e64f02b04..509e65ef1e 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceRemoveJob.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceRemoveJob.java @@ -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>> { +public class DhcpInterfaceRemoveJob implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(DhcpInterfaceRemoveJob.class); @@ -120,7 +120,7 @@ public class DhcpInterfaceRemoveJob implements Callable 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, diff --git a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceUpdateJob.java b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceUpdateJob.java index 065b1d5f21..dd4a323906 100644 --- a/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceUpdateJob.java +++ b/dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceUpdateJob.java @@ -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>> { +public class DhcpInterfaceUpdateJob implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(DhcpInterfaceUpdateJob.class); private final DhcpExternalTunnelManager dhcpExternalTunnelManager; diff --git a/dhcpservice/impl/src/main/resources/OSGI-INF/blueprint/dhcpservice.xml b/dhcpservice/impl/src/main/resources/OSGI-INF/blueprint/dhcpservice.xml index 1034d3e072..7b9024a0a5 100644 --- a/dhcpservice/impl/src/main/resources/OSGI-INF/blueprint/dhcpservice.xml +++ b/dhcpservice/impl/src/main/resources/OSGI-INF/blueprint/dhcpservice.xml @@ -4,7 +4,7 @@ odl:use-default-for-reference-types="true"> diff --git a/elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/api/ElanHelper.java b/elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/api/ElanHelper.java index f7ab4fb048..c054cb85ae 100644 --- a/elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/api/ElanHelper.java +++ b/elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/api/ElanHelper.java @@ -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(); diff --git a/elanmanager/impl/pom.xml b/elanmanager/impl/pom.xml index ceaabd68c5..d2358de27b 100644 --- a/elanmanager/impl/pom.xml +++ b/elanmanager/impl/pom.xml @@ -75,10 +75,14 @@ this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html neutronvpn-api ${project.version} - + + + org.opendaylight.mdsal + mdsal-binding-dom-adapter + org.opendaylight.ovsdb hwvtepsouthbound-api @@ -156,11 +160,17 @@ this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html ${genius.version} test - + + + org.opendaylight.mdsal + mdsal-binding-dom-adapter + test + test-jar org.opendaylight.mdsal diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ConfigMcastCache.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ConfigMcastCache.java index 757e9653fa..1e4c36e5c7 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ConfigMcastCache.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ConfigMcastCache.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInstanceCache.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInstanceCache.java index 1f30d60c26..7c691273c6 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInstanceCache.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInstanceCache.java @@ -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 { return get(ElanHelper.getElanInstanceConfigurationDataPath(elanInstanceName)); } catch (ReadFailedException e) { LOG.warn("Error reading ElanInstance {}", elanInstanceName, e); - return Optional.absent(); + return Optional.empty(); } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInterfaceCache.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInterfaceCache.java index 975885b043..5cb5af1e27 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInterfaceCache.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInterfaceCache.java @@ -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 return get(ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName)); } catch (ReadFailedException e) { LOG.warn("Error reading ElanInterface {}", interfaceName, e); - return Optional.absent(); + return Optional.empty(); } } @NonNull public Optional getEtreeInterface(@NonNull String interfaceName) { Optional 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 diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwValidateCli.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwValidateCli.java index 71a2b6699e..70a561fea5 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwValidateCli.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwValidateCli.java @@ -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 topoId = HwvtepSouthboundUtils.createHwvtepTopologyInstanceIdentifier(); - Optional operationalTopoOptional = tx.read(LogicalDatastoreType.OPERATIONAL, topoId).checkedGet(); - Optional configTopoOptional = tx.read(LogicalDatastoreType.CONFIGURATION, topoId).checkedGet(); + Optional operationalTopoOptional = tx.read(LogicalDatastoreType.OPERATIONAL, topoId).get(); + Optional 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 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()) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/NetworkL2gwDeviceInfoCli.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/NetworkL2gwDeviceInfoCli.java index e597e2fdb2..6894dfbc61 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/NetworkL2gwDeviceInfoCli.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/NetworkL2gwDeviceInfoCli.java @@ -8,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 nodes = new ArrayList<>(); Set networks = new HashSet<>(); - if (nodeId == null) { - Optional topologyOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, - createHwvtepTopologyInstanceIdentifier()); - if (topologyOptional.isPresent()) { - nodes.addAll(topologyOptional.get().nonnullNode()); - } - } else { - Optional nodeOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, - createInstanceIdentifier(new NodeId(new Uri(nodeId)))); - if (nodeOptional.isPresent()) { - nodes.add(nodeOptional.get()); + try { + if (nodeId == null) { + Optional topologyOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker, + LogicalDatastoreType.OPERATIONAL, createHwvtepTopologyInstanceIdentifier()); + if (topologyOptional.isPresent()) { + nodes.addAll(topologyOptional.get().nonnullNode()); + } + } else { + Optional 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 elanInstancesOptional = MDSALUtil.read(dataBroker, - LogicalDatastoreType.CONFIGURATION, - InstanceIdentifier.builder(ElanInstances.class).build()); - if (elanInstancesOptional.isPresent()) { - List 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 elanInstancesOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker, + LogicalDatastoreType.CONFIGURATION, + InstanceIdentifier.builder(ElanInstances.class).build()); + if (elanInstancesOptional.isPresent()) { + List 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 = hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).getSwitches(); if (switches != null) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/listeners/ElanMacEntryListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/listeners/ElanMacEntryListener.java index a5d44ab60f..b61f13d7ba 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/listeners/ElanMacEntryListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/listeners/ElanMacEntryListener.java @@ -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 { +public class ElanMacEntryListener extends AbstractAsyncDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(ElanMacEntryListener.class); private final DataBroker broker; @@ -36,35 +36,23 @@ public class ElanMacEntryListener extends AsyncDataTreeChangeListenerBase 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 instanceIdentifier, MacEntry macEntry) { + public void add(InstanceIdentifier 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 instanceIdentifier, MacEntry macEntry) { + public void remove(InstanceIdentifier 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 instanceIdentifier, MacEntry macEntry, MacEntry t1) { + public void update(InstanceIdentifier instanceIdentifier, MacEntry macEntry, MacEntry t1) { + } + + @Override + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/listeners/EvpnElanInstanceListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/listeners/EvpnElanInstanceListener.java index 776a8af04e..f24f7b7fd8 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/listeners/EvpnElanInstanceListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/listeners/EvpnElanInstanceListener.java @@ -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 { +public class EvpnElanInstanceListener extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.builder(ElanInstances.class).child(ElanInstance.class).build(); + public void add(InstanceIdentifier instanceIdentifier, ElanInstance evpnAugmentation) { } @Override - protected void add(InstanceIdentifier instanceIdentifier, ElanInstance evpnAugmentation) { + public void remove(InstanceIdentifier instanceIdentifier, ElanInstance evpnAugmentation) { } @Override - protected void remove(InstanceIdentifier instanceIdentifier, ElanInstance evpnAugmentation) { - } - - @Override - protected void update(InstanceIdentifier instanceIdentifier, ElanInstance original, + public void update(InstanceIdentifier instanceIdentifier, ElanInstance original, ElanInstance update) { String elanName = update.getElanInstanceName(); LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, confTx -> { @@ -100,8 +96,9 @@ public class EvpnElanInstanceListener extends AsyncDataTreeChangeListenerBase { +public class MacVrfEntryListener extends AbstractAsyncDataTreeChangeListener { 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 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 instanceIdentifier, MacVrfEntry macVrfEntry) { + public void add(InstanceIdentifier instanceIdentifier, MacVrfEntry macVrfEntry) { LOG.info("ADD: Adding DMAC Entry for MACVrfEntry {} ", macVrfEntry); evpnMacVrfUtils.addEvpnDmacFlow(instanceIdentifier, macVrfEntry); } @Override - protected void update(InstanceIdentifier instanceIdentifier, MacVrfEntry macVrfEntry, MacVrfEntry t1) { + public void update(InstanceIdentifier instanceIdentifier, MacVrfEntry macVrfEntry, MacVrfEntry t1) { } @Override - protected void remove(InstanceIdentifier instanceIdentifier, MacVrfEntry macVrfEntry) { + public void remove(InstanceIdentifier 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()); + } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/ElanEvpnFlowUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/ElanEvpnFlowUtils.java index cfc65d3018..ce51c4b6b6 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/ElanEvpnFlowUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/ElanEvpnFlowUtils.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java index a163ca9d3d..b25486c63b 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java @@ -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 instanceIdentifier) { - try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) { + try (ReadTransaction tx = dataBroker.newReadOnlyTransaction()) { String rd = instanceIdentifier.firstKeyOf(VrfTables.class).getRouteDistinguisher(); String elanName = null; InstanceIdentifier iidEvpnRdToNet = @@ -102,11 +102,11 @@ public class EvpnMacVrfUtils { new EvpnRdToNetworkKey(rd)).build(); try { Optional 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); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java index f7474943d9..9b1127f12e 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java @@ -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 gatewayMac = getGatewayMacAddressForInterface(l3VpName, + Optional 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 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 getDcGatewayTunnelInterfaceNameList() { @@ -417,28 +416,33 @@ public class EvpnUtils { Uint32 elanTag = elanInfo.getElanTag(); List 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 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 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 serviceHandler, BiConsumer flowHandler) { - ElanInstance elanInfo = elanInstanceCache.get(elanName).orNull(); + ElanInstance elanInfo = elanInstanceCache.get(elanName).orElse(null); List 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> 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>(settableFuture) { @Override diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java index 41caf64514..30903578c5 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java index 247c967b6d..b864f2e2fe 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java @@ -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 { + extends AbstractClusteredAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.builder(ElanDpnInterfaces.class).child(ElanDpnInterfacesList.class) - .child(DpnInterfaces.class).build(); + LOG.info("{} start", getClass().getSimpleName()); } void handleUpdate(InstanceIdentifier id, DpnInterfaces dpnInterfaces) { @@ -106,7 +103,7 @@ public class ElanDpnInterfaceClusteredListener } @Override - protected void remove(InstanceIdentifier identifier, final DpnInterfaces dpnInterfaces) { + public void remove(InstanceIdentifier 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 identifier, DpnInterfaces original, + public void update(InstanceIdentifier identifier, DpnInterfaces original, final DpnInterfaces dpnInterfaces) { List 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()); } - } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java index 863cee7be7..27465ba6ed 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java @@ -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 { + extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.builder(ElanDpnInterfaces.class).child(ElanDpnInterfacesList.class) - .child(DpnInterfaces.class).build(); - } - - @Override - protected void remove(InstanceIdentifier identifier, DpnInterfaces dpnInterfaces) { + public void remove(InstanceIdentifier identifier, DpnInterfaces dpnInterfaces) { } @Override - protected void update(InstanceIdentifier identifier, DpnInterfaces original, + public void update(InstanceIdentifier 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 interfaces = update.getInterfaces(); @@ -91,11 +88,11 @@ public class ElanDpnInterfacesListener } @Override - protected void add(InstanceIdentifier identifier, DpnInterfaces dpnInterfaces) { + public void add(InstanceIdentifier 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()); } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnToTransportZoneListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnToTransportZoneListener.java index 12b456cec8..f6ce28621c 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnToTransportZoneListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnToTransportZoneListener.java @@ -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 { + extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.builder(ElanDpnInterfaces.class).child(ElanDpnInterfacesList.class) - .child(DpnInterfaces.class).build(); - } - - @Override - protected void remove(InstanceIdentifier key, DpnInterfaces dataObjectModification) { + public void remove(InstanceIdentifier 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 key, DpnInterfaces dataObjectModificationBefore, + public void update(InstanceIdentifier key, DpnInterfaces dataObjectModificationBefore, DpnInterfaces dataObjectModificationAfter) { } @Override - protected void add(InstanceIdentifier key, DpnInterfaces dataObjectModification) { + public void add(InstanceIdentifier 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()); } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepConfigListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepConfigListener.java index c77635d569..952542f966 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepConfigListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepConfigListener.java @@ -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 { + extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier - .builder(ElanInstances.class) - .child(ElanInstance.class) - .child(ExternalTeps.class).build(); + LOG.info("{} registered", getClass().getSimpleName()); } @Override - protected void add(InstanceIdentifier iid, ExternalTeps tep) { + public void add(InstanceIdentifier 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 iid, ExternalTeps tep, ExternalTeps t1) { + public void update(InstanceIdentifier iid, ExternalTeps tep, ExternalTeps t1) { } @Override - protected void remove(InstanceIdentifier iid, ExternalTeps tep) { + public void remove(InstanceIdentifier 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()); } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepListener.java index 4ad8848bad..44974ae319 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepListener.java @@ -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 { +public class ElanExtnTepListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(ElanInstances.class).child(ElanInstance.class).child(ExternalTeps.class); - } - - @Override - protected void add(InstanceIdentifier instanceIdentifier, ExternalTeps tep) { + public void add(InstanceIdentifier instanceIdentifier, ExternalTeps tep) { LOG.trace("ExternalTeps add received {}", instanceIdentifier); updateBcGroupOfElan(instanceIdentifier, tep, true); } @Override - protected void update(InstanceIdentifier instanceIdentifier, ExternalTeps tep, ExternalTeps t1) { + public void update(InstanceIdentifier instanceIdentifier, ExternalTeps tep, ExternalTeps t1) { } @Override - protected void remove(InstanceIdentifier instanceIdentifier, ExternalTeps tep) { + public void remove(InstanceIdentifier 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()); } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanGroupCache.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanGroupCache.java index 0f63223db0..6aa03009da 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanGroupCache.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanGroupCache.java @@ -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 { +public class ElanGroupCache extends AbstractClusteredAsyncDataTreeChangeListener { 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 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 key, @@ -71,22 +64,17 @@ public class ElanGroupCache extends AsyncClusteredDataTreeChangeListenerBase key, Group deleted) { + public synchronized void remove(InstanceIdentifier key, Group deleted) { groupsById.remove(key); } @Override - protected void update(InstanceIdentifier key, Group old, Group updated) { + public void update(InstanceIdentifier key, Group old, Group updated) { add(key, updated); } @Override - protected synchronized void add(InstanceIdentifier key, Group added) { + public synchronized void add(InstanceIdentifier key, Group added) { if (groupsById.containsKey(key)) { groupsById.put(key, added); return; @@ -103,13 +91,21 @@ public class ElanGroupCache extends AsyncClusteredDataTreeChangeListenerBase getGroup(InstanceIdentifier key) throws ReadFailedException { + public Optional getGroup(InstanceIdentifier key) throws InterruptedException, ExecutionException { if (groupsById.containsKey(key)) { return Optional.of(groupsById.get(key)); } - ReadOnlyTransaction transaction = dataBroker.newReadOnlyTransaction(); - Optional optional = transaction.read(LogicalDatastoreType.CONFIGURATION, key).checkedGet(); + ReadTransaction transaction = dataBroker.newReadOnlyTransaction(); + Optional optional = transaction.read(LogicalDatastoreType.CONFIGURATION, key).get(); transaction.close(); return optional; } + + @Override + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); + } + } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java index f14edc1845..bb7ee06706 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java @@ -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 { +public class ElanInstanceManager extends AbstractAsyncDataTreeChangeListener { 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 identifier, ElanInstance deletedElan) { + public void remove(InstanceIdentifier 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 identifier, ElanInstance original, ElanInstance update) { + public void update(InstanceIdentifier 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 identifier, ElanInstance elanInstanceAdded) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(ElanInstances.class).child(ElanInstance.class); - } - - @Override - protected ElanInstanceManager getDataTreeChangeListener() { - return this; + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java index 25a6db5d9e..d889d3226f 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java @@ -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 { + extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(Interfaces.class).child(Interface.class); - } - - @Override - protected void remove(InstanceIdentifier key, Interface intrf) { + public void remove(InstanceIdentifier 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 key, Interface dataObjectModificationBefore, + public void update(InstanceIdentifier key, Interface dataObjectModificationBefore, Interface dataObjectModificationAfter) { // Not required to handle this event } @Override - protected void add(InstanceIdentifier key, Interface dataObjectModification) { + public void add(InstanceIdentifier key, Interface dataObjectModification) { // Not required to handle this event } @Override - protected ElanInterfaceConfigListener getDataTreeChangeListener() { - return this; + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } - } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java index 99c27429f4..0ed67f9220 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java @@ -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 +public class ElanInterfaceManager extends AbstractAsyncDataTreeChangeListener 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 getWildCardPath() { - return InstanceIdentifier.create(ElanInterfaces.class).child(ElanInterface.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void remove(InstanceIdentifier identifier, ElanInterface del) { + public void remove(InstanceIdentifier 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 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 elanInterfaceId = ElanUtils + .getElanInterfaceConfigurationDataPathId(interfaceName); + FluentFuture> 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 identifier, ElanInterface original, ElanInterface update) { + public void update(InstanceIdentifier 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 identifier, ElanInterface elanInterfaceAdded) { + public void add(InstanceIdentifier 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 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 { + extends AbstractAsyncDataTreeChangeListener { 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 identifier, Interface delIf) { + public void remove(InstanceIdentifier 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 identifier, Interface original, Interface update) { + public void update(InstanceIdentifier identifier, Interface original, Interface update) { } @Override - protected void add(InstanceIdentifier identifier, Interface intrf) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(InterfacesState.class).child(Interface.class); - } - - - @Override - protected ElanInterfaceStateChangeListener getDataTreeChangeListener() { - return this; - } - } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java index 5d5011f784..952e45a2ea 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java @@ -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 { + AbstractClusteredAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(InterfacesState.class).child(Interface.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void remove(InstanceIdentifier identifier, Interface delIf) { + public void remove(InstanceIdentifier identifier, Interface delIf) { } @Override - protected void update(InstanceIdentifier identifier, Interface original, final Interface update) { + public void update(InstanceIdentifier identifier, Interface original, final Interface update) { add(identifier, update); } @Override - protected void add(InstanceIdentifier identifier, final Interface intrf) { + public void add(InstanceIdentifier 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; - } - } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java index a8522c0490..8be2db2ec9 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java @@ -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 { + AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(LearntVpnVipToPortData.class).child(LearntVpnVipToPort.class); } @Override - protected void remove(InstanceIdentifier key, LearntVpnVipToPort dataObjectModification) { + public void remove(InstanceIdentifier 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 key, LearntVpnVipToPort dataObjectModificationBefore, + public void update(InstanceIdentifier key, LearntVpnVipToPort dataObjectModificationBefore, LearntVpnVipToPort dataObjectModificationAfter) { } @Override - protected void add(InstanceIdentifier key, LearntVpnVipToPort dataObjectModification) { + public void add(InstanceIdentifier 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>> { + private class StaticMacAddWorker implements Callable>> { String macAddress; String interfaceName; @@ -153,13 +148,13 @@ public class ElanLearntVpnVipToPortListener extends InstanceIdentifier 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>> { + private class StaticMacRemoveWorker implements Callable>> { 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 } +*/ diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanNodeListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanNodeListener.java index f97afee028..de14506d7b 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanNodeListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanNodeListener.java @@ -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 { +public class ElanNodeListener extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(Nodes.class).child(Node.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void remove(InstanceIdentifier identifier, Node del) { + public void remove(InstanceIdentifier identifier, Node del) { } @Override - protected void update(InstanceIdentifier identifier, Node original, Node update) { + public void update(InstanceIdentifier identifier, Node original, Node update) { } @Override - protected void add(InstanceIdentifier identifier, Node add) { + public void add(InstanceIdentifier 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 tx, final Uint64 dpnId) { mdsalManager.addFlow(tx, ArpResponderUtil.getArpResponderTableMissFlow(dpnId)); } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java index 94df81dd4a..50c728efe9 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java @@ -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 { +public class ElanOvsdbNodeListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Node node) { + public void remove(InstanceIdentifier identifier, Node node) { elanProvider.deleteExternalElanNetworks(node); } @Override - protected void update(InstanceIdentifier identifier, Node original, Node update) { + public void update(InstanceIdentifier 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 identifier, Node node) { + public void add(InstanceIdentifier 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 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); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java index f6403b3108..5f81155896 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java @@ -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 getElanInstances() { InstanceIdentifier 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 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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanSmacFlowEventListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanSmacFlowEventListener.java index 9576757d2c..ae3480d898 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanSmacFlowEventListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanSmacFlowEventListener.java @@ -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 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 macEntryIdForElanInstance = ElanUtils diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanTunnelInterfaceStateListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanTunnelInterfaceStateListener.java index 2ea1705665..f63bfc6328 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanTunnelInterfaceStateListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanTunnelInterfaceStateListener.java @@ -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 { +public class ElanTunnelInterfaceStateListener extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(TunnelsState.class).child(StateTunnelList.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void remove(InstanceIdentifier key, StateTunnelList delete) { + public void remove(InstanceIdentifier key, StateTunnelList delete) { } @Override - protected void update(InstanceIdentifier key, StateTunnelList original, + public void update(InstanceIdentifier key, StateTunnelList original, StateTunnelList update) { } @Override - protected void add(InstanceIdentifier key, StateTunnelList add) { + public void add(InstanceIdentifier 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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceAddWorkerOnElan.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceAddWorkerOnElan.java index 0f6ee87b47..c52bfae4d7 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceAddWorkerOnElan.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceAddWorkerOnElan.java @@ -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>> { +public class InterfaceAddWorkerOnElan implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(InterfaceAddWorkerOnElan.class); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceAddWorkerOnElanInterface.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceAddWorkerOnElanInterface.java index 541d104260..1a1ca12f1e 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceAddWorkerOnElanInterface.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceAddWorkerOnElanInterface.java @@ -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>> { +public class InterfaceAddWorkerOnElanInterface implements Callable>> { private final String key; private final ElanInterface elanInterface; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceRemoveWorkerOnElan.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceRemoveWorkerOnElan.java index 4473bd69e5..b579404917 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceRemoveWorkerOnElan.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceRemoveWorkerOnElan.java @@ -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>> { +public class InterfaceRemoveWorkerOnElan implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(InterfaceRemoveWorkerOnElan.class); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceRemoveWorkerOnElanInterface.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceRemoveWorkerOnElanInterface.java index 86a3cf555d..40035c0153 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceRemoveWorkerOnElanInterface.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceRemoveWorkerOnElanInterface.java @@ -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>> { +public class InterfaceRemoveWorkerOnElanInterface implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(InterfaceRemoveWorkerOnElanInterface.class); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/VpnDpnToTransportZoneListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/VpnDpnToTransportZoneListener.java index 723e2d4534..434694ca6b 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/VpnDpnToTransportZoneListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/VpnDpnToTransportZoneListener.java @@ -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 { + extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, VpnToDpnList del) { + public void remove(InstanceIdentifier identifier, VpnToDpnList del) { + if (!useTransportZone) { + return; + } LOG.debug("Vpn dpn {} remove detected, SHOULD BE deleting transport zones", del.getDpnId()); } @Override - protected void update(InstanceIdentifier identifier, VpnToDpnList original, VpnToDpnList update) { + public void update(InstanceIdentifier 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 identifier, VpnToDpnList add) { + public void add(InstanceIdentifier 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; - } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/HwvtepHAUtil.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/HwvtepHAUtil.java index 6bb622413a..24828d809f 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/HwvtepHAUtil.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/HwvtepHAUtil.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/IMergeCommand.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/IMergeCommand.java index d0e557d568..673433a9aa 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/IMergeCommand.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/IMergeCommand.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/MergeCommand.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/MergeCommand.java index 7ad738b6ed..c56d22e578 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/MergeCommand.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/MergeCommand.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/ConfigNodeUpdatedHandler.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/ConfigNodeUpdatedHandler.java index 78e28a113e..f8b7dd1e1f 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/ConfigNodeUpdatedHandler.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/ConfigNodeUpdatedHandler.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/HAEventHandler.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/HAEventHandler.java index 7e81f6ac2e..966be413b4 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/HAEventHandler.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/HAEventHandler.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/IHAEventHandler.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/IHAEventHandler.java index 6b76636d4e..64896dea37 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/IHAEventHandler.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/IHAEventHandler.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeConnectedHandler.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeConnectedHandler.java index 32349497f6..443e689b53 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeConnectedHandler.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeConnectedHandler.java @@ -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) ps.getSwitchRef().getValue()).get().orNull(); + Node childPsNode = tx.read((InstanceIdentifier) ps.getSwitchRef().getValue()).get().orElse(null); if (childPsNode != null) { InstanceIdentifier 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); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeCopier.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeCopier.java index 7e99d5a2d5..53b539db73 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeCopier.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeCopier.java @@ -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)) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/OpNodeUpdatedHandler.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/OpNodeUpdatedHandler.java index ff718b5af7..8d685026d6 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/OpNodeUpdatedHandler.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/OpNodeUpdatedHandler.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAConfigNodeListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAConfigNodeListener.java index 1fdf54f6af..dbbba71919 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAConfigNodeListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAConfigNodeListener.java @@ -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 String nodeId = HwvtepHAUtil.convertToGlobalNodeId(childPsPath.firstKeyOf(Node.class).getNodeId().getValue()); InstanceIdentifier 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); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpClusteredListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpClusteredListener.java index ac24ff9e2f..edc13401fc 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpClusteredListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpClusteredListener.java @@ -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 public synchronized void runAfterNodeIsConnected(InstanceIdentifier iid, Consumer> 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); } }); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpNodeListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpNodeListener.java index f17cbc465a..1f209e0fbd 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpNodeListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpNodeListener.java @@ -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 implem InstanceIdentifier 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 implem Node updatedChildNode, Node originalChildNode, DataObjectModification mod, - TypedReadWriteTransaction tx) throws ReadFailedException { + TypedReadWriteTransaction tx) { String oldHAId = HwvtepHAUtil.getHAIdFromManagerOtherConfig(originalChildNode); if (!Strings.isNullOrEmpty(oldHAId)) { //was already ha child @@ -182,10 +181,10 @@ public class HAOpNodeListener extends HwvtepNodeBaseListener implem InstanceIdentifier haGlobalPath = getHwvtepNodeHACache().getParent(childGlobalPath); InstanceIdentifier 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); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeBaseListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeBaseListener.java index 26d7d2cde3..b40ebebea2 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeBaseListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeBaseListener.java @@ -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 } protected void registerListener(Class dsType, DataBroker broker) throws Exception { - final DataTreeIdentifier treeId = new DataTreeIdentifier<>(Datastore.toType(dsType), + final DataTreeIdentifier 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 private void processUpdatedNodes(Collection> changes, TypedReadWriteTransaction tx) - throws ReadFailedException, ExecutionException, InterruptedException { + throws ExecutionException, InterruptedException { for (DataTreeModification change : changes) { final InstanceIdentifier key = change.getRootPath().getRootIdentifier(); final DataObjectModification mod = change.getRootNode(); @@ -209,7 +208,7 @@ public abstract class HwvtepNodeBaseListener private void processDisconnectedNodes(Collection> changes, TypedReadWriteTransaction tx) - throws InterruptedException, ExecutionException, ReadFailedException { + throws InterruptedException, ExecutionException { for (DataTreeModification change : changes) { final InstanceIdentifier key = change.getRootPath().getRootIdentifier(); final DataObjectModification mod = change.getRootNode(); @@ -273,11 +272,11 @@ public abstract class HwvtepNodeBaseListener //default methods void onGlobalNodeDelete(InstanceIdentifier key, Node added, TypedReadWriteTransaction tx) - throws ReadFailedException, ExecutionException, InterruptedException { + throws ExecutionException, InterruptedException { } void onPsNodeDelete(InstanceIdentifier key, Node addedPSNode, TypedReadWriteTransaction tx) - throws ReadFailedException, ExecutionException, InterruptedException { + throws ExecutionException, InterruptedException { } @@ -291,14 +290,12 @@ public abstract class HwvtepNodeBaseListener } void onGlobalNodeUpdate(InstanceIdentifier key, Node updated, Node original, - DataObjectModification mod, TypedReadWriteTransaction tx) - throws ReadFailedException, InterruptedException, ExecutionException { + DataObjectModification mod, TypedReadWriteTransaction tx) { } void onPsNodeUpdate(Node updated, - DataObjectModification mod, TypedReadWriteTransaction tx) - throws ReadFailedException, InterruptedException, ExecutionException { + DataObjectModification mod, TypedReadWriteTransaction 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 index 62c460f84f..0000000000 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeDataListener.java +++ /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 - extends AsyncDataTreeChangeListenerBase> { - - private static final Logger LOG = LoggerFactory.getLogger(HwvtepNodeDataListener.class); - - private final ManagedNewTransactionRunner txRunner; - private final SingleTransactionDataBroker singleTxBroker; - private final MergeCommand mergeCommand; - private final Class datastoreType; - private final BiConsumer, T> addOperation; - private final BiConsumer, T> removeOperation; - private final HwvtepNodeHACache hwvtepNodeHACache; - - public HwvtepNodeDataListener(DataBroker broker, - HwvtepNodeHACache hwvtepNodeHACache, - Class clazz, - Class> eventClazz, - MergeCommand mergeCommand, - Class 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 getWildCardPath(); - - @Override - protected void add(InstanceIdentifier identifier, T dataAdded) { - HAJobScheduler.getInstance().submitJob(() -> addOperation.accept(identifier, dataAdded)); - } - - @Override - protected void update(InstanceIdentifier 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 identifier, T dataRemoved) { - HAJobScheduler.getInstance().submitJob(() -> removeOperation.accept(identifier, dataRemoved)); - } - - private boolean isNodeConnected(InstanceIdentifier identifier) - throws ReadFailedException { - return singleTxBroker.syncReadOptional(LogicalDatastoreType.OPERATIONAL, - identifier.firstIdentifierOf(Node.class)).isPresent(); - } - - private static boolean isDataUpdated(Optional existingDataOptional, T newData) { - return !existingDataOptional.isPresent() || !Objects.equals(existingDataOptional.get(), newData); - } - - private void copyToParent(InstanceIdentifier identifier, T data) { - if (clazz == RemoteUcastMacs.class) { - LOG.trace("Skipping remote ucast macs to parent"); - return; - } - InstanceIdentifier 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 parentIdentifier = mergeCommand.generateId(parent, parentData); - LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(datastoreType, - tx -> writeToMdsal(tx, parentData, parentIdentifier)), LOG, "Error copying to parent"); - } - } - - private void deleteFromParent(InstanceIdentifier identifier, T data) { - if (clazz == RemoteUcastMacs.class) { - LOG.trace("Skipping remote ucast macs to parent"); - return; - } - InstanceIdentifier 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 parentIdentifier = mergeCommand.generateId(parent, parentData); - deleteFromMdsal(tx, parentIdentifier); - } - }), LOG, "Error deleting from parent"); - } - } - - private void copyToChildren(final InstanceIdentifier parentIdentifier, final T parentData) { - Set> children = getChildrenForHANode(parentIdentifier); - if (children != null) { - LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(datastoreType, tx -> { - for (InstanceIdentifier child : children) { - LOG.trace("Copy parent config data {} to child {}", mergeCommand.getDescription(), - getNodeId(child)); - final T childData = mergeCommand.transform(child, parentData); - final InstanceIdentifier identifier = mergeCommand.generateId(child, childData); - writeToMdsal(tx, childData, identifier); - } - }), LOG, "Error copying to children"); - } - } - - private void deleteFromChildren(final InstanceIdentifier parentIdentifier, final T parentData) { - Set> children = getChildrenForHANode(parentIdentifier); - if (children != null) { - LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(datastoreType, tx -> { - for (InstanceIdentifier child : children) { - LOG.trace("Delete parent config data {} to child {}", mergeCommand.getDescription(), - getNodeId(child)); - final T childData = mergeCommand.transform(child, parentData); - final InstanceIdentifier identifier = mergeCommand.generateId(child, childData); - deleteFromMdsal(tx, identifier); - } - }), LOG, "Error deleting from children"); - } - } - - private void writeToMdsal(final TypedReadWriteTransaction tx, final T data, - final InstanceIdentifier identifier) throws ExecutionException, InterruptedException { - if (isDataUpdated(tx.read(identifier).get(), data)) { - tx.put(identifier, data); - } - } - - private void deleteFromMdsal(final TypedReadWriteTransaction tx, - final InstanceIdentifier identifier) throws ExecutionException, InterruptedException { - if (tx.read(identifier).get().isPresent()) { - tx.delete(identifier); - } - } - - private static String getNodeId(InstanceIdentifier iid) { - return iid.firstKeyOf(Node.class).getNodeId().getValue(); - } - - @Override - protected HwvtepNodeDataListener getDataTreeChangeListener() { - return HwvtepNodeDataListener.this; - } - - protected Set> getChildrenForHANode(InstanceIdentifier identifier) { - InstanceIdentifier parent = identifier.firstIdentifierOf(Node.class); - return hwvtepNodeHACache.getChildrenForHANode(parent); - } - - protected InstanceIdentifier getHAParent(InstanceIdentifier identifier) { - InstanceIdentifier child = identifier.firstIdentifierOf(Node.class); - return hwvtepNodeHACache.getParent(child); - } -} diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/ManagerListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/ManagerListener.java index da1c97c019..5ad90a947a 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/ManagerListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/ManagerListener.java @@ -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 { +public final class ManagerListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 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 key, Managers managers) { + public void remove(InstanceIdentifier key, Managers managers) { } @Override - protected void update(InstanceIdentifier key, Managers before, Managers after) { + public void update(InstanceIdentifier key, Managers before, Managers after) { } @Override - protected void add(InstanceIdentifier key, Managers managers) { + public void add(InstanceIdentifier key, Managers managers) { InstanceIdentifier 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; - } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/merge/MergeCommandsAggregator.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/merge/MergeCommandsAggregator.java index 3203bc8d2f..489c3e8ce1 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/merge/MergeCommandsAggregator.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/merge/MergeCommandsAggregator.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/AssociateHwvtepToElanJob.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/AssociateHwvtepToElanJob.java index 8529a50160..3698b7a25f 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/AssociateHwvtepToElanJob.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/AssociateHwvtepToElanJob.java @@ -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>> { +public class AssociateHwvtepToElanJob implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(AssociateHwvtepToElanJob.class); private final DataBroker broker; @@ -69,7 +72,7 @@ public class AssociateHwvtepToElanJob implements Callable> call() { + public List> 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 createLogicalSwitch() { + private FluentFuture createLogicalSwitch() { final String logicalSwitchName = ElanL2GatewayUtils.getLogicalSwitchFromElan( elanInstance.getElanInstanceName()); String segmentationId = ElanUtils.getVxlanSegmentationId(elanInstance).toString(); @@ -98,7 +101,12 @@ public class AssociateHwvtepToElanJob implements Callable lsCreateFuture = HwvtepUtils.addLogicalSwitch(broker, hwvtepNodeId, logicalSwitch); - Futures.addCallback(lsCreateFuture, new FutureCallback() { + FluentFuture lsCreateFuture = HwvtepUtils.addLogicalSwitch(broker, hwvtepNodeId, + logicalSwitch); + lsCreateFuture.addCallback(new FutureCallback() { @Override - public void onSuccess(Void noarg) { + public void onSuccess(CommitInfo noarg) { // Listener will be closed after all configuration completed // on hwvtep by // listener itself diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/BcGroupUpdateJob.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/BcGroupUpdateJob.java index 48c13ffcc9..36d7b1b6f5 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/BcGroupUpdateJob.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/BcGroupUpdateJob.java @@ -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>> { +public class BcGroupUpdateJob implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger("HwvtepEventLogger"); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DeleteL2GwDeviceMacsFromElanJob.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DeleteL2GwDeviceMacsFromElanJob.java index cf17b1fab8..c6a5f3e7da 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DeleteL2GwDeviceMacsFromElanJob.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DeleteL2GwDeviceMacsFromElanJob.java @@ -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>> { +public class DeleteL2GwDeviceMacsFromElanJob implements Callable>> { /** The Constant JOB_KEY_PREFIX. */ private static final String JOB_KEY_PREFIX = "hwvtep:"; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DeleteLogicalSwitchJob.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DeleteLogicalSwitchJob.java index aa50730fca..c5d3b9139f 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DeleteLogicalSwitchJob.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DeleteLogicalSwitchJob.java @@ -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>> { +public class DeleteLogicalSwitchJob implements Callable>> { private DataBroker broker; /** The logical switch name. */ @@ -66,7 +65,7 @@ public class DeleteLogicalSwitchJob implements Callable> call() { + public List> call() { if (cancelled) { LOG.info("Delete logical switch job cancelled "); return Collections.emptyList(); @@ -82,7 +81,7 @@ public class DeleteLogicalSwitchJob implements Callable> futures = new ArrayList<>(); + List> futures = new ArrayList<>(); futures.add(HwvtepUtils.deleteLogicalSwitch(broker, hwvtepNodeId, logicalSwitchName)); if (clearUcast) { LOG.trace("Clearing the local ucast macs of device {} macs ", hwvtepNodeId.getValue()); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DisAssociateHwvtepFromElanJob.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DisAssociateHwvtepFromElanJob.java index 4f2b5fe1d5..053b171f6d 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DisAssociateHwvtepFromElanJob.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DisAssociateHwvtepFromElanJob.java @@ -24,7 +24,7 @@ import org.slf4j.LoggerFactory; /** * Created by ekvsver on 4/15/2016. */ -public class DisAssociateHwvtepFromElanJob implements Callable>> { +public class DisAssociateHwvtepFromElanJob implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(DisAssociateHwvtepFromElanJob.class); private final ElanL2GatewayUtils elanL2GatewayUtils; @@ -57,11 +57,11 @@ public class DisAssociateHwvtepFromElanJob implements Callable> call() { + public List> call() { String strHwvtepNodeId = hwvtepNodeId.getValue(); LOG.info("running disassosiate l2gw connection job for {} {}", elanName, strHwvtepNodeId); - List> futures = new ArrayList<>(); + List> futures = new ArrayList<>(); // Remove remote MACs and vlan mappings from physical port // Once all above configurations are deleted, delete logical diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DpnDmacJob.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DpnDmacJob.java index 8e9e862da9..82301d85ac 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DpnDmacJob.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DpnDmacJob.java @@ -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>> { +public class DpnDmacJob implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(DpnDmacJob.class); private String elanName; @@ -61,7 +61,7 @@ public class DpnDmacJob implements Callable>> { @Override public List> 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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/HwvtepDeviceMcastMacUpdateJob.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/HwvtepDeviceMcastMacUpdateJob.java index 4c2eee97ca..e638fb0d6e 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/HwvtepDeviceMcastMacUpdateJob.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/HwvtepDeviceMcastMacUpdateJob.java @@ -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>> { +public class HwvtepDeviceMcastMacUpdateJob implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(HwvtepDeviceMcastMacUpdateJob.class); private final ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/LogicalSwitchAddedJob.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/LogicalSwitchAddedJob.java index cba6adab15..1d809906c0 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/LogicalSwitchAddedJob.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/LogicalSwitchAddedJob.java @@ -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>> { +public class LogicalSwitchAddedJob implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(LogicalSwitchAddedJob.class); /** The logical switch name. */ @@ -66,11 +66,11 @@ public class LogicalSwitchAddedJob implements Callable> call() { + public List> call() { elanL2GatewayUtils.cancelDeleteLogicalSwitch(new NodeId(elanL2GwDevice.getHwvtepNodeId()), logicalSwitchName); LOG.debug("running logical switch added job for {} {}", logicalSwitchName, elanL2GwDevice.getHwvtepNodeId()); - List> futures = new ArrayList<>(); + List> futures = new ArrayList<>(); LOG.info("creating vlan bindings for {} {}", logicalSwitchName, elanL2GwDevice.getHwvtepNodeId()); futures.add(elanL2GatewayUtils.updateVlanBindingsInL2GatewayDevice( diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/McastUpdateJob.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/McastUpdateJob.java index 7ca09f1472..e9dcd447a4 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/McastUpdateJob.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/McastUpdateJob.java @@ -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>> { +public class McastUpdateJob implements Callable>> { private String elanName; private String nodeId; private ElanL2GatewayMulticastUtils mcastUtils; @@ -51,9 +51,9 @@ public class McastUpdateJob implements Callable>> { } @Override - public List> call() throws Exception { + public List> call() throws Exception { L2GatewayDevice device = ElanL2GwCacheUtils.getL2GatewayDeviceFromCache(elanName, nodeId); - ListenableFuture ft = null; + ListenableFuture ft = null; //TODO: make prepareRemoteMcastMacUpdateOnDevice return a ListenableFuture if (add) { ft = mcastUtils.prepareRemoteMcastMacUpdateOnDevice(elanName, device, !dpnOrConnectionRemoved , @@ -61,7 +61,7 @@ public class McastUpdateJob implements Callable>> { } else { ft = mcastUtils.deleteRemoteMcastMac(new NodeId(nodeId), elanName); } - List> fts = new ArrayList>(); + List> fts = new ArrayList<>(); fts.add(ft); return fts; } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ChildListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ChildListener.java index ed19a0e3e7..0b288d5944 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ChildListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ChildListener.java @@ -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

registerListener(final LogicalDatastoreType dsType, final InstanceIdentifier wildCard) throws Exception { - DataTreeIdentifier

treeId = new DataTreeIdentifier<>(dsType, wildCard); + DataTreeIdentifier

treeId = DataTreeIdentifier.create(dsType, wildCard); TaskRetryLooper looper = new TaskRetryLooper(STARTUP_LOOP_TICK, STARTUP_LOOP_MAX_RETRIES); return looper.loopUntilNoException(() -> dataBroker.registerDataTreeChangeListener(treeId, this)); } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java index 38cadc0217..a0f22ac4cb 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java @@ -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 { +public class ElanGroupListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 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 identifier, Group del) { + public void remove(InstanceIdentifier 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 identifier, @Nullable Group original, Group update) { + public void update(InstanceIdentifier 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 identifier, Group added) { + public void add(InstanceIdentifier identifier, Group added) { LOG.trace("received group add {}", added.key().getGroupId()); update(identifier, null/*original*/, added); } - - @Override - protected ElanGroupListener getDataTreeChangeListener() { - return this; - } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceEntityOwnershipListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceEntityOwnershipListener.java index b71598bf1b..c9f2429195 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceEntityOwnershipListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceEntityOwnershipListener.java @@ -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); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceListener.java index 60d780fe75..285b8a3f71 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceListener.java @@ -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 +public class ElanInstanceListener extends AbstractClusteredAsyncDataTreeChangeListener 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 identifier, + public void remove(final InstanceIdentifier 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 identifier, ElanInstance original, ElanInstance update) { - - } - - @Override - protected void add(InstanceIdentifier identifier, ElanInstance add) { - } + public void update(InstanceIdentifier identifier, ElanInstance original, ElanInstance update) { - @Override - protected ElanInstanceListener getDataTreeChangeListener() { - return ElanInstanceListener.this; } @Override - protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(ElanInstances.class).child(ElanInstance.class); + public void add(InstanceIdentifier identifier, ElanInstance add) { } - } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanMacTableCache.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanMacTableCache.java index 0df603c28d..3f1b967ce5 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanMacTableCache.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanMacTableCache.java @@ -10,13 +10,13 @@ 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 { +public class ElanMacTableCache extends AbstractClusteredAsyncDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(ElanMacTableCache.class); private final DataBroker dataBroker; private final ConcurrentHashMap 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 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 key, MacTable mac) { + public void remove(InstanceIdentifier key, MacTable mac) { macsByElan.remove(mac.getElanInstanceName()); } @Override - protected void update(InstanceIdentifier key, MacTable old, MacTable mac) { + public void update(InstanceIdentifier key, MacTable old, MacTable mac) { macsByElan.put(mac.getElanInstanceName(), mac); } @Override - protected void add(InstanceIdentifier key, MacTable mac) { + public void add(InstanceIdentifier key, MacTable mac) { macsByElan.put(mac.getElanInstanceName(), mac); } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepConfigNodeCache.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepConfigNodeCache.java index 401dee84d8..839d53b627 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepConfigNodeCache.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepConfigNodeCache.java @@ -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 { +public class HwvtepConfigNodeCache extends AbstractClusteredAsyncDataTreeChangeListener { + private static final Logger LOG = LoggerFactory.getLogger(HwvtepConfigNodeCache.class); + private final DataBroker dataBroker; private final Map, Node> cache = new ConcurrentHashMap<>(); private final Map, List> 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 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 key, Node deleted) { + public void remove(InstanceIdentifier key, Node deleted) { cache.remove(key); } @Override - protected void update(InstanceIdentifier key, Node old, Node added) { + public void update(InstanceIdentifier key, Node old, Node added) { cache.put(key, added); } @Override - protected synchronized void add(InstanceIdentifier key, Node added) { + public synchronized void add(InstanceIdentifier key, Node added) { cache.put(key, added); if (waitList.containsKey(key)) { waitList.remove(key).stream().forEach(runnable -> runnable.run()); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java index 1a3f54ef38..c6ac8ac1ab 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java @@ -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 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 diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepRemoteMcastMacListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepRemoteMcastMacListener.java index 58e1864c4f..1353813cc8 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepRemoteMcastMacListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepRemoteMcastMacListener.java @@ -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>> taskToRun; + Callable>> taskToRun; private final JobCoordinator jobCoordinator; @@ -72,10 +74,14 @@ public class HwvtepRemoteMcastMacListener public HwvtepRemoteMcastMacListener(DataBroker broker, ElanUtils elanUtils, String logicalSwitchName, L2GatewayDevice l2GatewayDevice, List expectedPhyLocatorIps, - Callable>> task, + Callable>> 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 getWildCardPath() { return HwvtepSouthboundUtils.createRemoteMcastMacsInstanceIdentifier(nodeId, logicalSwitchName, new MacAddress(ElanConstants.UNKNOWN_DMAC)); } - @Override - protected HwvtepRemoteMcastMacListener getDataTreeChangeListener() { - return this; - } - @Override protected void removed(InstanceIdentifier identifier, RemoteMcastMacs deleted) { LOG.trace("Received Remove DataChange Notification for identifier: {}, RemoteMcastMacs: {}", identifier, diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java index e3db1b6ddf..b7f39d556a 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java @@ -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 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> 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> handlePortDeleted(InstanceIdentifier identifier) { InstanceIdentifier 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 getVlanBindings(List l2GwConns, NodeId hwvtepNodeId, String psName, diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayConnectionListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayConnectionListener.java index 395b11b509..107752d606 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayConnectionListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayConnectionListener.java @@ -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 implements RecoverableListener { +public class L2GatewayConnectionListener extends AbstractClusteredAsyncDataTreeChangeListener + 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 identifier, final L2gatewayConnection input) { + public void add(final InstanceIdentifier 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 identifier, L2gatewayConnection input) { + public void remove(InstanceIdentifier 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 identifier, L2gatewayConnection original, + public void update(InstanceIdentifier identifier, L2gatewayConnection original, L2gatewayConnection update) { LOG.trace("Updating L2gatewayConnection : original value={}, updated value={}", original, update); } - @Override - protected InstanceIdentifier 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 topoIid = HwvtepSouthboundUtils.createHwvtepTopologyInstanceIdentifier(); Futures.addCallback(tx.read(CONFIGURATION, topoIid), new FutureCallback>() { @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 optional = MDSALUtil.read(broker, CONFIGURATION, parentIid); + Optional 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() diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayListener.java index c4acf7f792..6ca6063799 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayListener.java @@ -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 +public class L2GatewayListener extends AbstractClusteredAsyncDataTreeChangeListener 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 getWildCardPath() { - return InstanceIdentifier.create(Neutron.class).child(L2gateways.class).child(L2gateway.class); - } - - @Override - protected void add(final InstanceIdentifier identifier, final L2gateway input) { + public void add(final InstanceIdentifier 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 identifier, final L2gateway input) { + public void remove(final InstanceIdentifier identifier, final L2gateway input) { LOG.info("Removing L2gateway with ID: {}", input.getUuid()); List connections = l2gwService .getL2GwConnectionsByL2GatewayId(input.getUuid()); @@ -147,7 +152,7 @@ public class L2GatewayListener extends AsyncClusteredDataTreeChangeListenerBase< } @Override - protected void update(InstanceIdentifier identifier, L2gateway original, L2gateway update) { + public void update(InstanceIdentifier identifier, L2gateway original, L2gateway update) { LOG.trace("Updating L2gateway : key: {}, original value={}, update value={}", identifier, original, update); List 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> deviceInterfacesMap = new HashMap<>(); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/LocalUcastMacListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/LocalUcastMacListener.java index 58fd551aa1..817dfb4f6e 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/LocalUcastMacListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/LocalUcastMacListener.java @@ -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 { LOG.trace("On parent add {}", nodeIid); Node operNode = modification.getRootNode().getDataAfter(); - Set configMacs = getMacs(tx.read(nodeIid).get().orNull()); + Set configMacs = getMacs(tx.read(nodeIid).get().orElse(null)); Set operMacs = getMacs(operNode); Set staleMacs = Sets.difference(configMacs, operMacs); staleMacs.forEach(staleMac -> removed(getMacIid(nodeIid, staleMac), staleMac)); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/recovery/impl/L2GatewayConnectionInstanceRecoveryHandler.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/recovery/impl/L2GatewayConnectionInstanceRecoveryHandler.java index 2e249477a6..e6be95734d 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/recovery/impl/L2GatewayConnectionInstanceRecoveryHandler.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/recovery/impl/L2GatewayConnectionInstanceRecoveryHandler.java @@ -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 l2gatewayConnectionOptional = MDSALUtil - .read(dataBroker, LogicalDatastoreType.CONFIGURATION, connectionInstanceIdentifier); + Optional 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); + } } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/recovery/impl/L2GatewayInstanceRecoveryHandler.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/recovery/impl/L2GatewayInstanceRecoveryHandler.java index 8a4728aac0..cf417d1f01 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/recovery/impl/L2GatewayInstanceRecoveryHandler.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/recovery/impl/L2GatewayInstanceRecoveryHandler.java @@ -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 l2gatewayInstanceIdentifier = InstanceIdentifier.create(Neutron.class) .child(L2gateways.class).child(L2gateway.class, new L2gatewayKey(uuid)); - Optional l2gatewayOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, - l2gatewayInstanceIdentifier); - L2gateway l2gateway = l2gatewayOptional.get(); + Optional 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 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 identifier = InstanceIdentifier.create(Neutron.class) + List 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 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() { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java index d43253e508..c68a1d747d 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java @@ -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> handleMcastForElanL2GwDeviceDelete(String elanName, + public List> handleMcastForElanL2GwDeviceDelete(String elanName, L2GatewayDevice l2GatewayDevice) { - ListenableFuture deleteTepFuture = + FluentFuture deleteTepFuture = txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx -> tx.delete(buildExternalTepPath(elanName, l2GatewayDevice.getTunnelIp()))); updateMcastMacsForAllElanDevices(elanName, l2GatewayDevice, false/* updateThisDevice */); - ListenableFuture 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 deleteRemoteMcastMac(NodeId nodeId, String logicalSwitchName) { + public FluentFuture deleteRemoteMcastMac(NodeId nodeId, String logicalSwitchName) { InstanceIdentifier 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 instanceIdentifier = InstanceIdentifier + try { + InstanceIdentifier 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; } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java index e2ecee8111..9fea57d0c2 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java @@ -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 removeRemoteUcastMacsFromExternalDevice(String deviceNodeId, - String logicalSwitchName, List macAddresses) { + private FluentFuture removeRemoteUcastMacsFromExternalDevice(String deviceNodeId, + String logicalSwitchName, + List 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 deleteElanMacsFromL2GatewayDevice(String hwvtepNodeId, String elanName) { + public FluentFuture deleteElanMacsFromL2GatewayDevice(String hwvtepNodeId, String elanName) { String logicalSwitch = getLogicalSwitchFromElan(elanName); List lstElanMacs = getRemoteUcastMacs(new NodeId(hwvtepNodeId), logicalSwitch, LogicalDatastoreType.CONFIGURATION); - ListenableFuture future = HwvtepUtils.deleteRemoteUcastMacs(broker, new NodeId(hwvtepNodeId), + FluentFuture future = HwvtepUtils.deleteRemoteUcastMacs(broker, new NodeId(hwvtepNodeId), logicalSwitch, lstElanMacs); - Futures.addCallback(future, new FutureCallback() { + Futures.addCallback(future, new FutureCallback() { @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 getRemoteUcastMacs(NodeId hwvtepNodeId, String logicalSwitch, LogicalDatastoreType datastoreType) { List 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 = 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 installElanMacsInL2GatewayDevice(String elanName, - L2GatewayDevice l2GatewayDevice) { + public FluentFuture installElanMacsInL2GatewayDevice(String elanName, + L2GatewayDevice l2GatewayDevice) { String logicalSwitchName = getLogicalSwitchFromElan(elanName); NodeId hwVtepNodeId = new NodeId(l2GatewayDevice.getHwvtepNodeId()); @@ -639,7 +653,8 @@ public class ElanL2GatewayUtils { List lstRemoteUcastMacs = new ArrayList<>(lstL2GatewayDevicesMacs); lstRemoteUcastMacs.addAll(lstElanMacTableEntries); - ListenableFuture future = HwvtepUtils.addRemoteUcastMacs(broker, hwVtepNodeId, lstRemoteUcastMacs); + FluentFuture 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 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 readTransportZone(DataBroker dataBroker) throws ReadFailedException { + private static Optional readTransportZone(DataBroker dataBroker) throws ExecutionException, + InterruptedException { return new SingleTransactionDataBroker(dataBroker).syncReadOptional(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(TransportZones.class).build()); } - private static Optional readElanInstances(DataBroker dataBroker) throws ReadFailedException { + private static Optional 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 configNode = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, - HwvtepSouthboundUtils.createInstanceIdentifier(new NodeId(l2gwDevice.getHwvtepNodeId()))); + Optional 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) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanRefUtil.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanRefUtil.java index 86d4027591..caa37a6fa0 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanRefUtil.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanRefUtil.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java index 2042f7134b..d9c7f1aaef 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java @@ -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 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 getL2gatewayList(DataBroker broker) { InstanceIdentifier 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 getAllL2gatewayConnections(DataBroker broker) { InstanceIdentifier 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 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>(settableFuture) { - @Override - public void onSuccess(@NonNull Optional resultNode) { + FluentFuture> fluentFuture = broker.newReadOnlyTransaction().read( + LogicalDatastoreType.OPERATIONAL, nodeIid); + Futures.addCallback(fluentFuture, new FutureCallback>() { + @Override + public void onSuccess(Optional nodeOptional) { + if (nodeOptional.isPresent()) { + Node node = nodeOptional.get(); + if (node.augmentation(HwvtepGlobalAugmentation.class) != null) { + List 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 nodeOptional = resultNode; - if (nodeOptional.isPresent()) { - Node node = nodeOptional.get(); - if (node.augmentation(HwvtepGlobalAugmentation.class) != null) { - List localUcastMacs = - node.augmentation(HwvtepGlobalAugmentation.class).getLocalUcastMacs(); - if (localUcastMacs == null) { - return; - } - localUcastMacs.stream() - .filter((mac) -> macBelongsToLogicalSwitch(mac, elanName)) - .forEach((mac) -> { - InstanceIdentifier macIid = getMacIid(nodeIid, mac); - localUcastMacListener.added(macIid, mac); - }); - } - } + localUcastMacs.stream() + .filter((mac) -> macBelongsToLogicalSwitch(mac, elanName)) + .forEach((mac) -> { + InstanceIdentifier 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); } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2gwServiceProvider.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2gwServiceProvider.java index 1d1c1c72a1..7dbaaad76c 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2gwServiceProvider.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2gwServiceProvider.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/StaleVlanBindingsCleaner.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/StaleVlanBindingsCleaner.java index 4688f95700..b44ec27322 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/StaleVlanBindingsCleaner.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/StaleVlanBindingsCleaner.java @@ -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); }); } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/recovery/impl/ElanInterfaceRecoveryHandler.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/recovery/impl/ElanInterfaceRecoveryHandler.java index bf349fd62f..bb538fdd4c 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/recovery/impl/ElanInterfaceRecoveryHandler.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/recovery/impl/ElanInterfaceRecoveryHandler.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java index ceb575a0bf..9201e97306 100755 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanClusterUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanClusterUtils.java index 5d3e8ff396..0b628921f4 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanClusterUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanClusterUtils.java @@ -32,7 +32,7 @@ public final class ElanClusterUtils { HwvtepSouthboundConstants.ELAN_ENTITY_NAME, jobCoordinator, jobDesc, job); } - public void runOnlyInOwnerNode(String jobKey, String jobDesc, Callable>> job) { + public void runOnlyInOwnerNode(String jobKey, String jobDesc, Callable>> job) { entityOwnershipUtils.runOnlyInOwnerNode(HwvtepSouthboundConstants.ELAN_ENTITY_TYPE, HwvtepSouthboundConstants.ELAN_ENTITY_NAME, jobCoordinator, jobKey, jobDesc, job); } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java index 7b6bddc04f..cf1b273569 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanEtreeUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanEtreeUtils.java index 16a33b7a1b..548493e608 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanEtreeUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanEtreeUtils.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanForwardingEntriesHandler.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanForwardingEntriesHandler.java index 524c533ddc..24f5e2b563 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanForwardingEntriesHandler.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanForwardingEntriesHandler.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanItmUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanItmUtils.java index a319c94e04..7dabac216a 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanItmUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanItmUtils.java @@ -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; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java index cef193f439..b52dd2ad77 100755 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java @@ -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 DEFAULT_CALLBACK = new FutureCallback() { + public static final FutureCallback DEFAULT_CALLBACK = new FutureCallback() { @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 Optional read(@NonNull DataBroker broker, LogicalDatastoreType datastoreType, InstanceIdentifier 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 Optional read2(LogicalDatastoreType datastoreType, InstanceIdentifier path) - throws ReadFailedException { - try (ReadOnlyTransaction tx = broker.newReadOnlyTransaction()) { - CheckedFuture, ReadFailedException> checkedFuture = tx.read(datastoreType, path); - return checkedFuture.checkedGet(); + throws InterruptedException, ExecutionException { + try (ReadTransaction tx = broker.newReadOnlyTransaction()) { + FluentFuture> checkedFuture = tx.read(datastoreType, path); + return checkedFuture.get(); } } @SuppressWarnings("checkstyle:ForbidCertainMethod") public static void delete(DataBroker broker, LogicalDatastoreType datastoreType, - InstanceIdentifier path) { + InstanceIdentifier path) { WriteTransaction tx = broker.newWriteOnlyTransaction(); tx.delete(datastoreType, path); - Futures.addCallback(tx.submit(), DEFAULT_CALLBACK, MoreExecutors.directExecutor()); + FluentFuture future = tx.commit(); + future.addCallback(DEFAULT_CALLBACK, MoreExecutors.directExecutor()); } public static InstanceIdentifier getElanInterfaceConfigurationDataPathId(String interfaceName) { @@ -376,13 +378,20 @@ public class ElanUtils { @Nullable public static Elan getElanByName(DataBroker broker, String elanInstanceName) { InstanceIdentifier 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 tx, String elanInstanceName) throws ExecutionException, InterruptedException { - return tx.read(getElanInstanceOperationalDataPath(elanInstanceName)).get().orNull(); + return tx.read(getElanInstanceOperationalDataPath(elanInstanceName)).get().orElse(null); } public static InstanceIdentifier getElanInstanceOperationalDataPath(String elanInstanceName) { @@ -394,13 +403,13 @@ public class ElanUtils { public MacEntry getInterfaceMacEntriesOperationalDataPath(String interfaceName, PhysAddress physAddress) { InstanceIdentifier existingMacEntryId = getInterfaceMacEntriesIdentifierOperationalDataPath( interfaceName, physAddress); - return read(broker, LogicalDatastoreType.OPERATIONAL, existingMacEntryId).orNull(); + return read(broker, LogicalDatastoreType.OPERATIONAL, existingMacEntryId).orElse(null); } @Nullable public MacEntry getInterfaceMacEntriesOperationalDataPathFromId(TypedReadTransaction tx, InstanceIdentifier identifier) throws ExecutionException, InterruptedException { - return tx.read(identifier).get().orNull(); + return tx.read(identifier).get().orElse(null); } public static InstanceIdentifier getInterfaceMacEntriesIdentifierOperationalDataPath(String interfaceName, @@ -426,7 +435,7 @@ public class ElanUtils { @Nullable public MacEntry getMacEntryFromElanMacId(TypedReadTransaction tx, InstanceIdentifier identifier) throws ExecutionException, InterruptedException { - return tx.read(identifier).get().orNull(); + return tx.read(identifier).get().orElse(null); } public static InstanceIdentifier getMacEntryOperationalDataPath(String elanName, @@ -449,7 +458,7 @@ public class ElanUtils { public static ElanInterfaceMac getElanInterfaceMacByInterfaceName(DataBroker dataBroker, String interfaceName) { InstanceIdentifier elanInterfaceId = getElanInterfaceMacEntriesOperationalDataPath( interfaceName); - return read(dataBroker, LogicalDatastoreType.OPERATIONAL, elanInterfaceId).orNull(); + return read(dataBroker, LogicalDatastoreType.OPERATIONAL, elanInterfaceId).orElse(null); } public static InstanceIdentifier getElanInterfaceMacEntriesOperationalDataPath( @@ -472,7 +481,7 @@ public class ElanUtils { public DpnInterfaces getElanInterfaceInfoByElanDpn(String elanInstanceName, Uint64 dpId) { InstanceIdentifier 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 elanId = getElanInfoEntriesOperationalDataPath(elanTag); Optional existingElanInfo = read(broker, LogicalDatastoreType.OPERATIONAL, elanId); - return existingElanInfo.orNull(); + return existingElanInfo.orElse(null); } public static InstanceIdentifier getElanInfoEntriesOperationalDataPath(Uint32 elanTag) { @@ -527,14 +536,14 @@ public class ElanUtils { @Nullable public ElanDpnInterfacesList getElanDpnInterfacesList(String elanName) { InstanceIdentifier elanDpnInterfaceId = getElanDpnOperationDataPath(elanName); - return read(broker, LogicalDatastoreType.OPERATIONAL, elanDpnInterfaceId).orNull(); + return read(broker, LogicalDatastoreType.OPERATIONAL, elanDpnInterfaceId).orElse(null); } @Nullable public ElanDpnInterfaces getElanDpnInterfacesList() { InstanceIdentifier 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 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 getElanDPNByName(String elanInstanceName) { InstanceIdentifier 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 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 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 tunType = TunnelTypeVxlan.class; InstanceIdentifier 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 getAllExternalTunnels(LogicalDatastoreType datastoreType) { InstanceIdentifier 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 getSourceIpAddress(Ethernet ethernet) { - Optional srcIpAddress = Optional.absent(); + Optional srcIpAddress = Optional.empty(); if (ethernet.getPayload() == null) { return srcIpAddress; } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java index 21eda00fa6..330a09c92f 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java @@ -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 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 bridgeRefInfoPath = InstanceIdentifier.create(BridgeRefInfo.class) .child(BridgeRefEntry.class, new BridgeRefEntryKey(dpnId)); - // FIXME: Read this through a cache - Optional 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 optionalBridgeRefEntry = + singleTxBroker + .syncReadOptional(LogicalDatastoreType.OPERATIONAL, bridgeRefInfoPath); + if (!optionalBridgeRefEntry.isPresent()) { + LOG.error("no bridge ref entry found for dpnId {}", dpnId); + return Optional.empty(); + } - InstanceIdentifier nodeId = - optionalBridgeRefEntry.get().getBridgeReference().getValue().firstIdentifierOf(Node.class); + InstanceIdentifier nodeId = + optionalBridgeRefEntry.get().getBridgeReference().getValue() + .firstIdentifierOf(Node.class); - // FIXME: Read this through a cache - Optional optionalNode = singleTxBroker.syncReadOptional(LogicalDatastoreType.OPERATIONAL, nodeId); - if (!optionalNode.isPresent()) { - LOG.error("missing node for dpnId {}", dpnId); + // FIXME: Read this through a cache + Optional 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 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(); } } diff --git a/elanmanager/impl/src/main/resources/OSGI-INF/blueprint/elanmanager.xml b/elanmanager/impl/src/main/resources/OSGI-INF/blueprint/elanmanager.xml index 9b0739d605..7e03897709 100644 --- a/elanmanager/impl/src/main/resources/OSGI-INF/blueprint/elanmanager.xml +++ b/elanmanager/impl/src/main/resources/OSGI-INF/blueprint/elanmanager.xml @@ -4,10 +4,10 @@ odl:use-default-for-reference-types="true"> + interface="org.opendaylight.mdsal.binding.api.DataBroker" + odl:type="default" /> + interface="org.opendaylight.mdsal.binding.api.NotificationService" /> d2psnodePath, InstanceIdentifier 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 d1psnodePath, InstanceIdentifier 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 terminationPointNames, InstanceIdentifier d1ps, InstanceIdentifier haPsa, ReadWriteTransaction readWriteTransaction, - Node nodeD, Node nodeHa) throws ReadFailedException { + Node nodeD, Node nodeHa) throws ExecutionException, InterruptedException { for (String portName : terminationPointNames) { InstanceIdentifier 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 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", diff --git a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elan/l2gw/nodehandlertest/TestUtil.java b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elan/l2gw/nodehandlertest/TestUtil.java index 9e3cb90fe5..73088427f6 100644 --- a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elan/l2gw/nodehandlertest/TestUtil.java +++ b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elan/l2gw/nodehandlertest/TestUtil.java @@ -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 readNode(LogicalDatastoreType datastoreType, InstanceIdentifier id, - ReadOnlyTransaction tx) throws Exception { - return tx.read(datastoreType, id).checkedGet(); + ReadTransaction tx) throws Exception { + return tx.read(datastoreType, id).get(); } diff --git a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTest.java b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTest.java index 17e67e5067..bcbf0847e4 100644 --- a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTest.java +++ b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTest.java @@ -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; diff --git a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestBase.java b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestBase.java index 16436d3c66..24d0ab340a 100644 --- a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestBase.java +++ b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestBase.java @@ -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) { diff --git a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestModule.java b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestModule.java index 901e3df960..9ce65d924e 100644 --- a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestModule.java +++ b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestModule.java @@ -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())) diff --git a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/L2gwBuilders.java b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/L2gwBuilders.java index e0d1dcd143..e39db9ad72 100644 --- a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/L2gwBuilders.java +++ b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/L2gwBuilders.java @@ -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; diff --git a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/Verifications.java b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/Verifications.java index 432a29d774..4946d88404 100644 --- a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/Verifications.java +++ b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/Verifications.java @@ -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; diff --git a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/BgpManagerTestImpl.java b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/BgpManagerTestImpl.java index e79e947fd2..ad8ee04508 100644 --- a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/BgpManagerTestImpl.java +++ b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/BgpManagerTestImpl.java @@ -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; diff --git a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/EvpnTestHelper.java b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/EvpnTestHelper.java index d65a8451c8..7231213d23 100644 --- a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/EvpnTestHelper.java +++ b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/EvpnTestHelper.java @@ -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; diff --git a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/VpnManagerTestImpl.java b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/VpnManagerTestImpl.java index b2416e2b37..361276740d 100644 --- a/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/VpnManagerTestImpl.java +++ b/elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/VpnManagerTestImpl.java @@ -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 { diff --git a/fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/FibHelper.java b/fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/FibHelper.java index 8d6e822072..e5c1754c82 100644 --- a/fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/FibHelper.java +++ b/fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/FibHelper.java @@ -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 getVrfEntry(DataBroker broker, String rd, String ipPrefix) { + public static Optional getVrfEntry(DataBroker broker, String rd, String ipPrefix) { InstanceIdentifier 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 com.google.common.base.Optional read(DataBroker broker, + private static Optional read(DataBroker broker, LogicalDatastoreType datastoreType, InstanceIdentifier 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); diff --git a/fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/IFibManager.java b/fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/IFibManager.java index 0b687463f5..e0a929e048 100644 --- a/fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/IFibManager.java +++ b/fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/IFibManager.java @@ -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 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 writeConfigTxn); void addVrfTable(String rd, WriteTransaction writeConfigTxn); diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BaseVrfEntryHandler.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BaseVrfEntryHandler.java index 83e88cb3b4..c502c0f629 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BaseVrfEntryHandler.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BaseVrfEntryHandler.java @@ -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 vpnExtraRoutesId = getVpnToExtrarouteIdentifier( - optVpnName, vpnRd, destPrefix); - return MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, vpnExtraRoutesId).orNull(); + InstanceIdentifier 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; } diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BgpRouteVrfEntryHandler.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BgpRouteVrfEntryHandler.java index 1747f1fdab..758915fc89 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BgpRouteVrfEntryHandler.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BgpRouteVrfEntryHandler.java @@ -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 transactionObjects) { + } + @Override public void create(WriteTransaction tx, LogicalDatastoreType datastoreType, InstanceIdentifier identifier, Object vrfEntry, List 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); }); } diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/EvpnVrfEntryHandler.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/EvpnVrfEntryHandler.java index a23c54d147..cd5fe82f8c 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/EvpnVrfEntryHandler.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/EvpnVrfEntryHandler.java @@ -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 extraRouteOptional = Optional.absent(); + final Optional extraRouteOptional = Optional.empty(); if (localDpnIdList.size() <= 0) { for (VpnToDpnList curDpn1 : vpnToDpnList) { if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.BGP) { diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java index 2e668bad84..6a139bd54d 100755 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java @@ -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 writeConfigTxn) { fibUtil.updateRoutePathForFibEntry(rd, prefix, nextHop, label, nextHopAdd, writeConfigTxn); } diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibRpcServiceImpl.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibRpcServiceImpl.java index 89bd6dda4f..2d48dab4b3 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibRpcServiceImpl.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibRpcServiceImpl.java @@ -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 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 getVpnInstanceToVpnIdIdentifier(String vpnName) { @@ -226,7 +233,12 @@ public class FibRpcServiceImpl implements FibRpcService { static Uint32 getVpnId(DataBroker broker, String vpnName) { InstanceIdentifier 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; } } diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java index 41ca0e5538..8531ed3247 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java @@ -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 getVpnInstanceOpData(String rd) { InstanceIdentifier 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 getVpnInstanceOpData(TypedReadTransaction operTx, String rd) @@ -196,8 +202,13 @@ public class FibUtil { InstanceIdentifier id = InstanceIdentifier.create(VpnInstanceOpData.class) .child(VpnInstanceOpDataEntry.class, new VpnInstanceOpDataEntryKey(rd)); - Optional vpnInstanceOpData = - MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); + Optional 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 localNextHopInfoData = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, - getPrefixToInterfaceIdentifier(vpnId, ipPrefix)); + Optional 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 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 adjacencyData = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, - getAdjacencyIdentifierOp(ifName, vpnName, ipPrefix)); + Optional 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 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 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 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 getVpnIdToVpnInstanceIdentifier(Uint32 vpnId) { @@ -419,7 +453,14 @@ public class FibUtil { InstanceIdentifier vrfEntryId = InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)) .child(VrfEntry.class, new VrfEntryKey(prefix)).build(); - Optional entry = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId); + Optional 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 = 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 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 routePath = MDSALUtil.read(dataBroker, - LogicalDatastoreType.CONFIGURATION, routePathId); + Optional 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 ifStateOptional = MDSALUtil.read(dataBroker, - LogicalDatastoreType.CONFIGURATION, vrfTableId); + Optional 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 ifStateId = buildStateInterfaceId(interfaceName); - Optional ifStateOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, ifStateId); + Optional 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 tunnelInfoId = InstanceIdentifier.builder(DpnEndpoints.class).child(DPNTEPsInfo.class, new DPNTEPsInfoKey(dpnId)).build(); - Optional tunnelInfo = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, tunnelInfoId); + Optional 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 nexthopIpList = tunnelInfo.get().getTunnelEndPoints(); if (nexthopIpList != null && !nexthopIpList.isEmpty()) { @@ -677,7 +744,15 @@ public class FibUtil { public List getNextHopAddresses(String rd, String prefix) { InstanceIdentifier vrfEntryId = getNextHopIdentifier(rd, prefix); - Optional vrfEntry = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId); + Optional 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 getNexthops(String nextHopKey) { InstanceIdentifier 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 getL3VpnDcGateWays() { InstanceIdentifier id = InstanceIdentifier.builder(L3vpnDcGws.class) .build(); - Optional dcGwsOpt = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); + Optional 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 vrfEntryId = InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)) .child(VrfEntry.class, new VrfEntryKey(prefix)).build(); - Optional entry = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId); + Optional 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 paths = entry.get().getRoutePaths(); for (RoutePaths path: paths) { diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java index fb001c31f4..8aeb0183e0 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java @@ -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 id = idBuilder.build(); - Optional vpnNexthops = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); + Optional 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 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 configuredTransTypeFromConfig = - MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, getConfTransportTypeIdentifier()); - + Optional 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 getDcGwIps() { InstanceIdentifier 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 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; } diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/RouterInterfaceVrfEntryHandler.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/RouterInterfaceVrfEntryHandler.java index b3e3a6dc9e..0ca1328499 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/RouterInterfaceVrfEntryHandler.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/RouterInterfaceVrfEntryHandler.java @@ -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; diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java index 51a62e5a11..45e5dbad60 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java @@ -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 { +public class VrfEntryListener extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(FibEntries.class).child(VrfTables.class).child(VrfEntry.class); - } - - @Override - protected void add(final InstanceIdentifier identifier, final VrfEntry vrfEntry) { + public void add(final InstanceIdentifier 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 identifier, VrfEntry vrfEntry) { + public void remove(InstanceIdentifier 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 identifier, VrfEntry original, VrfEntry update) { + public void update(InstanceIdentifier 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 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 vrfEntryId = InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)) .child(VrfEntry.class, new VrfEntryKey(prefix)).build(); - Optional vrfEntry = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId); + Optional 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 id = VpnHelper.getVpnToDpnListIdentifier(rd, dpnId); - Optional dpnInVpn = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); + Optional 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 lriIid = InstanceIdentifier.builder(LabelRouteMap.class) .child(LabelRouteInfo.class, label).build(); - Optional opResult = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, lriIid); + Optional 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>> { + private class CleanupVpnInterfaceWorker implements Callable>> { Prefixes prefixInfo; Uint32 vpnId; String rd; @@ -1530,8 +1540,8 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase makeLFibTableEntry(curDpn.getDpnId(), label, null, DEFAULT_FIB_FLOW_PRIORITY, NwConstants.DEL_FLOW, tx)); @@ -1596,7 +1606,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase id = buildVrfId(rd); final VpnInstanceOpDataEntry vpnInstance = fibUtil.getVpnInstance(rd); List txnObjects = new ArrayList<>(); - final Optional vrfTable = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id); + final Optional 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 extraRouteOptional = Optional.absent(); + Optional 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 id = buildVrfId(rd); final VpnInstanceOpDataEntry vpnInstance = fibUtil.getVpnInstance(rd); List txnObjects = new ArrayList<>(); - final Optional vrfTable = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id); + final Optional 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 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 vrfEntryId = InstanceIdentifier.builder(FibEntries.class) .child(VrfTables.class, new VrfTablesKey(rd)) .child(VrfEntry.class, new VrfEntryKey(ipPrefix)).build(); - Optional vrfEntry = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId); + Optional 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(); } diff --git a/fibmanager/impl/src/main/resources/OSGI-INF/blueprint/fibmanager.xml b/fibmanager/impl/src/main/resources/OSGI-INF/blueprint/fibmanager.xml index 58cb064cca..0d79bee7ed 100644 --- a/fibmanager/impl/src/main/resources/OSGI-INF/blueprint/fibmanager.xml +++ b/fibmanager/impl/src/main/resources/OSGI-INF/blueprint/fibmanager.xml @@ -4,7 +4,7 @@ odl:use-default-for-reference-types="true"> diff --git a/fibmanager/impl/src/test/java/org/opendaylight/netvirt/fibmanager/test/FibManagerTest.java b/fibmanager/impl/src/test/java/org/opendaylight/netvirt/fibmanager/test/FibManagerTest.java index cc5b6adeca..474b7c5fe9 100644 --- a/fibmanager/impl/src/test/java/org/opendaylight/netvirt/fibmanager/test/FibManagerTest.java +++ b/fibmanager/impl/src/test/java/org/opendaylight/netvirt/fibmanager/test/FibManagerTest.java @@ -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 diff --git a/fibmanager/shell/src/main/java/org/opendaylight/netvirt/fibmanager/shell/ShowFibCommand.java b/fibmanager/shell/src/main/java/org/opendaylight/netvirt/fibmanager/shell/ShowFibCommand.java index a8ed8d0159..194f822c26 100644 --- a/fibmanager/shell/src/main/java/org/opendaylight/netvirt/fibmanager/shell/ShowFibCommand.java +++ b/fibmanager/shell/src/main/java/org/opendaylight/netvirt/fibmanager/shell/ShowFibCommand.java @@ -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; diff --git a/fibmanager/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/fibmanager/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml index 8eb01deb38..3bcfe1a47f 100644 --- a/fibmanager/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml +++ b/fibmanager/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -10,7 +10,7 @@ odl:use-default-for-reference-types="true"> - + diff --git a/ipv6service/impl/pom.xml b/ipv6service/impl/pom.xml index 25d81489a1..b53b710281 100644 --- a/ipv6service/impl/pom.xml +++ b/ipv6service/impl/pom.xml @@ -27,10 +27,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html javax.inject true - + org.opendaylight.genius interfacemanager-api diff --git a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/IfMgr.java b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/IfMgr.java index a5888dc11c..3a28efafab 100644 --- a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/IfMgr.java +++ b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/IfMgr.java @@ -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; diff --git a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/Ipv6NodeListener.java b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/Ipv6NodeListener.java index dc7133fcdd..26e78b4ea0 100644 --- a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/Ipv6NodeListener.java +++ b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/Ipv6NodeListener.java @@ -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 { +public class Ipv6NodeListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 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 key, FlowCapableNode dataObjectModificationBefore, + public void update(InstanceIdentifier key, FlowCapableNode dataObjectModificationBefore, FlowCapableNode dataObjectModificationAfter) { // do nothing } @Override - protected void add(InstanceIdentifier key, FlowCapableNode dataObjectModification) { + public void add(InstanceIdentifier key, FlowCapableNode dataObjectModification) { LOG.trace("FlowCapableNode Added: key: {}", key); NodeKey nodeKey = key.firstKeyOf(Node.class); @@ -92,16 +96,7 @@ public class Ipv6NodeListener extends AsyncClusteredDataTreeChangeListenerBase key, FlowCapableNode dataObjectModification) { + public void remove(InstanceIdentifier key, FlowCapableNode dataObjectModification) { // do nothing } - - /* (non-Javadoc) - * @see org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase#getDataTreeChangeListener() - */ - @Override - protected Ipv6NodeListener getDataTreeChangeListener() { - return Ipv6NodeListener.this; - } - } diff --git a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/Ipv6ServiceInterfaceEventListener.java b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/Ipv6ServiceInterfaceEventListener.java index 25dc482143..04d02853e1 100644 --- a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/Ipv6ServiceInterfaceEventListener.java +++ b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/Ipv6ServiceInterfaceEventListener.java @@ -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 { + extends AbstractClusteredAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(InterfacesState.class).child(Interface.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void remove(InstanceIdentifier key, Interface del) { + public void remove(InstanceIdentifier 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 key, Interface before, Interface after) { + public void update(InstanceIdentifier 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 key, Interface add) { + public void add(InstanceIdentifier key, Interface add) { List ofportIds = add.getLowerLayerIf(); if (!L2vlan.class.equals(add.getType())) { @@ -178,9 +181,4 @@ public class Ipv6ServiceInterfaceEventListener } } } - - @Override - protected Ipv6ServiceInterfaceEventListener getDataTreeChangeListener() { - return Ipv6ServiceInterfaceEventListener.this; - } } diff --git a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronNetworkChangeListener.java b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronNetworkChangeListener.java index 7280340886..fa2ba1ceaa 100644 --- a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronNetworkChangeListener.java +++ b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronNetworkChangeListener.java @@ -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 { +public class NeutronNetworkChangeListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 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 identifier, Network input) { + public void add(InstanceIdentifier 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 identifier, Network input) { + public void remove(InstanceIdentifier identifier, Network input) { LOG.debug("Remove Network notification handler is invoked {} ", input); ifMgr.removeNetwork(input.getUuid()); } @Override - protected void update(InstanceIdentifier identifier, Network original, Network update) { + public void update(InstanceIdentifier 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; - } - } diff --git a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronPortChangeListener.java b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronPortChangeListener.java index 8f241eaae3..d90c1ff9b7 100644 --- a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronPortChangeListener.java +++ b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronPortChangeListener.java @@ -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 { +public class NeutronPortChangeListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 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 identifier, Port port) { + public void add(InstanceIdentifier 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 identifier, Port port) { + public void remove(InstanceIdentifier 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 identifier, Port original, Port update) { + public void update(InstanceIdentifier 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 getFixedIpSet(@Nullable List fixedIps) { return fixedIps != null ? new HashSet<>(fixedIps) : Collections.emptySet(); } - - @Override - protected NeutronPortChangeListener getDataTreeChangeListener() { - return NeutronPortChangeListener.this; - } } diff --git a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronRouterChangeListener.java b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronRouterChangeListener.java index c01d918667..47c5b2f6b3 100644 --- a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronRouterChangeListener.java +++ b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronRouterChangeListener.java @@ -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 { +public class NeutronRouterChangeListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 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 identifier, Router input) { + public void add(InstanceIdentifier 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 identifier, Router input) { + public void remove(InstanceIdentifier identifier, Router input) { LOG.info("Remove Router notification handler is invoked {}.", input.getUuid()); ifMgr.removeRouter(input.getUuid()); } @Override - protected void update(InstanceIdentifier identifier, Router original, Router update) { + public void update(InstanceIdentifier identifier, Router original, Router update) { LOG.debug("Update Router notification handler is invoked. Original: {}, Updated: {}.", original, update); } - - @Override - protected NeutronRouterChangeListener getDataTreeChangeListener() { - return NeutronRouterChangeListener.this; - } - } diff --git a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronSubnetChangeListener.java b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronSubnetChangeListener.java index d1620cd93c..16631db814 100644 --- a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronSubnetChangeListener.java +++ b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronSubnetChangeListener.java @@ -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 { +public class NeutronSubnetChangeListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 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 identifier, Subnet input) { + public void add(InstanceIdentifier 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 identifier, Subnet input) { + public void remove(InstanceIdentifier identifier, Subnet input) { ifMgr.removeSubnet(input.getUuid()); } @Override - protected void update(InstanceIdentifier identifier, Subnet original, Subnet update) { + public void update(InstanceIdentifier identifier, Subnet original, Subnet update) { LOG.debug("Update Subnet notification handler is invoked Original: {}, Update: {}", original, update); } - - @Override - protected NeutronSubnetChangeListener getDataTreeChangeListener() { - return NeutronSubnetChangeListener.this; - } - } diff --git a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/utils/Ipv6ServiceUtils.java b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/utils/Ipv6ServiceUtils.java index da50b15ede..eee8ff2c4b 100644 --- a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/utils/Ipv6ServiceUtils.java +++ b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/utils/Ipv6ServiceUtils.java @@ -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 Optional read(LogicalDatastoreType datastoreType, InstanceIdentifier 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 getIcmpv6RSMatch(Long elanTag) { diff --git a/ipv6service/impl/src/main/resources/OSGI-INF/blueprint/ipv6service.xml b/ipv6service/impl/src/main/resources/OSGI-INF/blueprint/ipv6service.xml index d69c904a73..661b5f0f6e 100644 --- a/ipv6service/impl/src/main/resources/OSGI-INF/blueprint/ipv6service.xml +++ b/ipv6service/impl/src/main/resources/OSGI-INF/blueprint/ipv6service.xml @@ -4,7 +4,7 @@ odl:use-default-for-reference-types="true"> diff --git a/natservice/impl/pom.xml b/natservice/impl/pom.xml index e6c572dbe1..c383b288c6 100644 --- a/natservice/impl/pom.xml +++ b/natservice/impl/pom.xml @@ -39,6 +39,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html org.opendaylight.controller sal-binding-broker-impl + + org.opendaylight.mdsal + mdsal-binding-dom-adapter + org.apache.karaf.shell org.apache.karaf.shell.commands diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/cli/DisplayNaptSwithcesCli.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/cli/DisplayNaptSwithcesCli.java index 1327f5cf15..894031fca5 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/cli/DisplayNaptSwithcesCli.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/cli/DisplayNaptSwithcesCli.java @@ -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 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(); } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/NatSwitchCacheImpl.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/NatSwitchCacheImpl.java index 72ff00b143..2ac428347c 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/NatSwitchCacheImpl.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/NatSwitchCacheImpl.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/SnatCentralizedSwitchChangeListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/SnatCentralizedSwitchChangeListener.java index 764b416d93..f0a92e4834 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/SnatCentralizedSwitchChangeListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/SnatCentralizedSwitchChangeListener.java @@ -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 { + extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(NaptSwitches.class).child(RouterToNaptSwitch.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void remove(InstanceIdentifier key, RouterToNaptSwitch routerToNaptSwitch) { + public void remove(InstanceIdentifier 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 key, RouterToNaptSwitch origRouterToNaptSwitch, + public void update(InstanceIdentifier 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 key, RouterToNaptSwitch routerToNaptSwitch) { + public void add(InstanceIdentifier 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; - } } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/SnatNodeEventListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/SnatNodeEventListener.java index d9206d99d1..f7060b1818 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/SnatNodeEventListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/SnatNodeEventListener.java @@ -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(); diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/WeightedCentralizedSwitchScheduler.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/WeightedCentralizedSwitchScheduler.java index 4669980941..8454a8492d 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/WeightedCentralizedSwitchScheduler.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/WeightedCentralizedSwitchScheduler.java @@ -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 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; } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java index cf2e862834..7f262fa0e9 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java @@ -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()); diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ConntrackBasedSnatService.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ConntrackBasedSnatService.java index ab3e0a16b4..d57a305141 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ConntrackBasedSnatService.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ConntrackBasedSnatService.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnDnatFlowProgrammer.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnDnatFlowProgrammer.java index fab8244712..864fd2c2f3 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnDnatFlowProgrammer.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnDnatFlowProgrammer.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnNaptSwitchHA.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnNaptSwitchHA.java index a197b618d9..509b591428 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnNaptSwitchHA.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnNaptSwitchHA.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnSnatFlowProgrammer.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnSnatFlowProgrammer.java index ecc38de53a..c65acf3bb6 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnSnatFlowProgrammer.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnSnatFlowProgrammer.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworkGroupInstaller.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworkGroupInstaller.java index efa7ed3a3d..52878b14a2 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworkGroupInstaller.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworkGroupInstaller.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworksChangeListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworksChangeListener.java index 5f4be360db..9f75bdb304 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworksChangeListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworksChangeListener.java @@ -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 { +public class ExternalNetworksChangeListener extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(ExternalNetworks.class).child(Networks.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void add(InstanceIdentifier identifier, Networks networks) { - - } + public void add(InstanceIdentifier identifier, Networks networks) { - @Override - protected ExternalNetworksChangeListener getDataTreeChangeListener() { - return ExternalNetworksChangeListener.this; } @Override - protected void remove(InstanceIdentifier identifier, Networks networks) { + public void remove(InstanceIdentifier 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 identifier, Networks original, Networks update) { + public void update(InstanceIdentifier 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 routerPortsId = NatUtil.getRouterPortsId(routerId.getValue()); - Optional optRouterPorts = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, - routerPortsId); + Optional 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 = NatUtil.buildNaptSwitchRouterIdentifier(routerId.getValue()); - Optional rtrToNapt = - MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, routerToNaptSwitch); + Optional 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 routerPortsId = NatUtil.getRouterPortsId(routerId.getValue()); - Optional optRouterPorts = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, - routerPortsId); + Optional 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: {} " diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java index bbaebf4ed9..f32704a5bc 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java @@ -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 { +public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Routers routers) { + public void add(InstanceIdentifier 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 identifier, Routers original, Routers update) { + public void update(InstanceIdentifier 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 identifier, Routers router) { + public void remove(InstanceIdentifier 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 writeFlowInvTx) { Collection externalSubnetIdsForRouter = NatUtil.getExternalSubnetIdsForRouter(dataBroker, diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalSubnetChangeListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalSubnetChangeListener.java index b070371e9f..e8f3f8ae96 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalSubnetChangeListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalSubnetChangeListener.java @@ -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 { +public class ExternalSubnetChangeListener extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(ExternalSubnets.class).child(Subnets.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void remove(InstanceIdentifier key, Subnets subnet) { + public void remove(InstanceIdentifier 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 key, Subnets orig, + public void update(InstanceIdentifier key, Subnets orig, Subnets update) { } @Override - protected void add(InstanceIdentifier key, Subnets subnet) { - } - - @Override - protected ExternalSubnetChangeListener getDataTreeChangeListener() { - return ExternalSubnetChangeListener.this; + public void add(InstanceIdentifier key, Subnets subnet) { } } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalSubnetVpnInstanceListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalSubnetVpnInstanceListener.java index fa6bf575bd..49cc3810ed 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalSubnetVpnInstanceListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalSubnetVpnInstanceListener.java @@ -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 { +public class ExternalSubnetVpnInstanceListener extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(VpnInstanceToVpnId.class).child(VpnInstance.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void remove(InstanceIdentifier key, VpnInstance vpnInstance) { + public void remove(InstanceIdentifier 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 key, VpnInstance vpnInstanceOrig, + public void update(InstanceIdentifier 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 key, VpnInstance vpnInstance) { + public void add(InstanceIdentifier 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; - } } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FlatVlanConntrackBasedSnatService.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FlatVlanConntrackBasedSnatService.java index 7d4526355d..c4fd80a00a 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FlatVlanConntrackBasedSnatService.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FlatVlanConntrackBasedSnatService.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FloatingIPListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FloatingIPListener.java index 16e337d7fd..443126f769 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FloatingIPListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FloatingIPListener.java @@ -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 { +public class FloatingIPListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, + public void add(final InstanceIdentifier identifier, final InternalToExternalPortMap mapping) { LOG.trace("FloatingIPListener add ip mapping method - key: {} value: {}",mapping.key(), mapping); processFloatingIPAdd(identifier, mapping); } @Override - protected void remove(InstanceIdentifier identifier, InternalToExternalPortMap mapping) { + public void remove(InstanceIdentifier identifier, InternalToExternalPortMap mapping) { LOG.trace("FloatingIPListener remove ip mapping method - kkey: {} value: {}",mapping.key(), mapping); processFloatingIPDel(identifier, mapping); } @Override - protected void update(InstanceIdentifier identifier, InternalToExternalPortMap + public void update(InstanceIdentifier 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 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); } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/Ipv6ForwardingService.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/Ipv6ForwardingService.java index b177cd9204..1366dbcfd9 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/Ipv6ForwardingService.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/Ipv6ForwardingService.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/Ipv6SubnetFlowProgrammer.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/Ipv6SubnetFlowProgrammer.java index 22945dd336..b812f0adaa 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/Ipv6SubnetFlowProgrammer.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/Ipv6SubnetFlowProgrammer.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NAPTSwitchSelector.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NAPTSwitchSelector.java index 24ad45bc66..0fa5117f97 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NAPTSwitchSelector.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NAPTSwitchSelector.java @@ -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 constructNAPTSwitches() { - Optional optNaptSwitches = - MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, getNaptSwitchesIdentifier()); + Optional 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 switchWeights = new HashMap<>(); if (optNaptSwitches.isPresent()) { diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptEventHandler.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptEventHandler.java index 9630fb6cf1..127ffd79bf 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptEventHandler.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptEventHandler.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptManager.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptManager.java index 07605ca385..b90d8e7003 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptManager.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptManager.java @@ -11,13 +11,13 @@ */ 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 id = InstanceIdentifier.builder(ExternalIpsCounter.class) .child(ExternalCounters.class, new ExternalCountersKey(segmentId)) .child(ExternalIpCounter.class, new ExternalIpCounterKey(externalIp)).build(); - Optional externalIpCounter = - MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); + Optional 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 getIpMapList(DataBroker broker, Uint32 routerId) { InstanceIdentifier 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 id = idBuilder.build(); - Optional ipPortMapType = - MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id); + Optional 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 idBuilder = InstanceIdentifier.builder(IntextIpMap.class).child(IpMapping.class, new IpMappingKey(segmentId)); InstanceIdentifier id = idBuilder.build(); - Optional ipMapping = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); + Optional 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 id = idBuilder.build(); // Get externalIp and decrement the counter String externalIp = null; - Optional ipMap = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); + Optional 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 id = idBuilder.build(); - Optional ipMap = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); + Optional 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 id = idBuilder.build(); // Get all externalIps and decrement their counters before deleting the ipmap - Optional ipMapping = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); + Optional 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 idBuilder = InstanceIdentifier.builder(IntextIpPortMap.class) .child(IpPortMapping.class, new IpPortMappingKey(segmentId)).build(); - Optional ipPortMapping = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, - idBuilder); + Optional 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 intIp = InstanceIdentifier.builder(SnatintIpPortMap.class) .child(IntipPortMap.class, new IntipPortMapKey(segmentId)).build(); - Optional intIpPortMap = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, intIp); + Optional 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); diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptSwitchHA.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptSwitchHA.java index 9b07e4f99c..0227b9746f 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptSwitchHA.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptSwitchHA.java @@ -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 vrfEntryId = idBuilder.build(); - Optional ent = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId); + Optional 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); diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatArpNotificationHandler.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatArpNotificationHandler.java index a622baea1a..0f127a7d24 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatArpNotificationHandler.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatArpNotificationHandler.java @@ -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); } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatEvpnUtil.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatEvpnUtil.java index cbc8146a9d..0a1d53f035 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatEvpnUtil.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatEvpnUtil.java @@ -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 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 id = NatUtil.buildfloatingIpIdToPortMappingIdentifier(floatingIpId); return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker, - LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map( + LogicalDatastoreType.CONFIGURATION, id).map( FloatingIpIdToPortMapping::getFloatingIpPortId).orElse(null); } } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatInterfaceStateChangeListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatInterfaceStateChangeListener.java index ceb53d3601..9835ce6642 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatInterfaceStateChangeListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatInterfaceStateChangeListener.java @@ -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 { + extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Interface intrf) { + public void add(InstanceIdentifier 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 identifier, Interface intrf) { + public void remove(InstanceIdentifier 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 identifier, Interface original, Interface update) { + public void update(InstanceIdentifier 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()); diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatRouterInterfaceListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatRouterInterfaceListener.java index 5a72127f1b..a009d12ad6 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatRouterInterfaceListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatRouterInterfaceListener.java @@ -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 { +public class NatRouterInterfaceListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Interfaces interfaceInfo) { + public void add(InstanceIdentifier 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 identifier, Interfaces interfaceInfo) { + public void remove(InstanceIdentifier 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 identifier, Interfaces original, Interfaces update) { + public void update(InstanceIdentifier identifier, Interfaces original, Interfaces update) { LOG.trace("update key: {}, original: {}, update: {}", update.key(), original, update); } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatScalein.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatScalein.java index f6202bf3e0..d8d8ad4dbf 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatScalein.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatScalein.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatSouthboundEventHandlers.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatSouthboundEventHandlers.java index 8fb44aaea3..478dd32c2b 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatSouthboundEventHandlers.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatSouthboundEventHandlers.java @@ -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>> { + private class NatInterfaceStateAddWorker implements Callable>> { private final String interfaceName; private final String routerName; private final Uint64 intfDpnId; @@ -225,7 +225,7 @@ public class NatSouthboundEventHandlers { } } - private class NatInterfaceStateRemoveWorker implements Callable>> { + private class NatInterfaceStateRemoveWorker implements Callable>> { private final String interfaceName; private final String routerName; private final Uint64 intfDpnId; @@ -255,7 +255,7 @@ public class NatSouthboundEventHandlers { } } - private class NatInterfaceStateUpdateWorker implements Callable>> { + private class NatInterfaceStateUpdateWorker implements Callable>> { private final Interface original; private final Interface update; private final Uint64 intfDpnId; @@ -373,7 +373,7 @@ public class NatSouthboundEventHandlers { } } - private class NatFlowAddWorker implements Callable>> { + private class NatFlowAddWorker implements Callable>> { private final String interfaceName; private final String routerName; private final Uint64 dpnId; @@ -402,7 +402,7 @@ public class NatSouthboundEventHandlers { } } - private class NatFlowUpdateWorker implements Callable>> { + private class NatFlowUpdateWorker implements Callable>> { private final Interface original; private final Interface update; private final String routerName; @@ -441,7 +441,7 @@ public class NatSouthboundEventHandlers { } } - private class NatFlowRemoveWorker implements Callable>> { + private class NatFlowRemoveWorker implements Callable>> { private final String interfaceName; private final String routerName; private final Uint64 intfDpnId; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatSwitchCacheListenerImpl.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatSwitchCacheListenerImpl.java index a7b85c2843..638a43b9b4 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatSwitchCacheListenerImpl.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatSwitchCacheListenerImpl.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTepChangeListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTepChangeListener.java index 317ea36df1..35d2a5ba7c 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTepChangeListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTepChangeListener.java @@ -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 { +public class NatTepChangeListener extends AbstractAsyncDataTreeChangeListener { 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 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 key, + public void remove(InstanceIdentifier 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 key, + public void update(InstanceIdentifier 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 key, + public void add(InstanceIdentifier 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 routerPortsId = NatUtil.getRouterPortsId(routerName); - Optional optRouterPorts = MDSALUtil.read(dataBroker, LogicalDatastoreType - .CONFIGURATION, routerPortsId); + Optional 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 extRoutersId = NatUtil.buildRouterIdentifier(routerName); - Optional routerData = Optional.absent(); + Optional 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; - } } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTunnelInterfaceStateListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTunnelInterfaceStateListener.java index ee8daa1119..e4fa49ffeb 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTunnelInterfaceStateListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTunnelInterfaceStateListener.java @@ -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 { +public class NatTunnelInterfaceStateListener extends AbstractAsyncDataTreeChangeListener { 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 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 instanceIdentifier, StateTunnelList add) { + public void add(InstanceIdentifier instanceIdentifier, StateTunnelList add) { LOG.trace("add : TEP addtion---- {}", add); hndlTepEvntsForDpn(add, TunnelAction.TUNNEL_EP_ADD); } @Override - protected void remove(InstanceIdentifier identifier, StateTunnelList del) { + public void remove(InstanceIdentifier identifier, StateTunnelList del) { LOG.trace("remove : TEP deletion---- {}", del); // Moved the remove implementation logic to NatTepChangeLister.remove() } @Override - protected void update(InstanceIdentifier identifier, StateTunnelList original, + public void update(InstanceIdentifier 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 routerPortsId = NatUtil.getRouterPortsId(routerName); - Optional optRouterPorts = MDSALUtil.read(dataBroker, LogicalDatastoreType - .CONFIGURATION, routerPortsId); + Optional 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); diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java index 5d99bb22fd..2a50c7fa43 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java @@ -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 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 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 buildRouterIdentifier(String routerId) { @@ -518,20 +518,20 @@ public final class NatUtil { static boolean isSnatEnabledForRouterId(DataBroker broker, String routerId) { InstanceIdentifier 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 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 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 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 tx, Uuid networkId) { InstanceIdentifier 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 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 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 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 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 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 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 getIportMappingIdentifier(Uint32 routerId) { @@ -1085,8 +1085,15 @@ public final class NatUtil { InstanceIdentifier id = InstanceIdentifier.builder(ExternalIpsCounter.class) .child(ExternalCounters.class, new ExternalCountersKey(segmentId)).build(); - Optional externalCountersData = - MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); + Optional 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 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 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 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 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 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 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 ifStateId = buildStateInterfaceId(interfaceName); return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker, - LogicalDatastoreType.OPERATIONAL, ifStateId).orNull(); + LogicalDatastoreType.OPERATIONAL, ifStateId).orElse(null); } static InstanceIdentifier buildStateInterfaceId(String interfaceName) { @@ -1723,13 +1730,13 @@ public final class NatUtil { public static Routers getRoutersFromConfigDS(DataBroker dataBroker, String routerName) { InstanceIdentifier routerIdentifier = NatUtil.buildRouterIdentifier(routerName); return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker, - LogicalDatastoreType.CONFIGURATION, routerIdentifier).orNull(); + LogicalDatastoreType.CONFIGURATION, routerIdentifier).orElse(null); } @Nullable public static Routers getRoutersFromConfigDS(TypedReadTransaction 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 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 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 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 routerPortsIdentifier = getRouterPortsId(routerUuid.getValue()); List 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 getOptionalExternalSubnets(TypedReadTransaction tx, Uuid subnetId) { if (subnetId == null) { LOG.warn("getOptionalExternalSubnets : subnetId is null"); - return Optional.absent(); + return Optional.empty(); } InstanceIdentifier elanIdentifierId = getElanInstanceConfigurationDataPath(elanInstanceName); return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker, - LogicalDatastoreType.CONFIGURATION, elanIdentifierId).orNull(); + LogicalDatastoreType.CONFIGURATION, elanIdentifierId).orElse(null); } @Nullable public static ElanInstance getElanInstanceByName(TypedReadTransaction 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 id = getVpnToDpnListIdentifier(rd, dpnId); - Optional dpnInVpn = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); + Optional 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 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 id = buildNetworkIdentifier(networkId); - Optional networkData = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, id); - + Optional 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 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 routerUuidList = getOptionalExternalSubnets(broker, externalSubnetId).toJavaUtil() - .map(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external + List 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 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 id = getVpnInstanceToVpnIdIdentifier(vpnName); Optional 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()) { diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatVpnMapsChangeListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatVpnMapsChangeListener.java index 6d71511c30..a66b2baa87 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatVpnMapsChangeListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatVpnMapsChangeListener.java @@ -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 { +public class NatVpnMapsChangeListener extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(VpnMaps.class).child(VpnMap.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void add(InstanceIdentifier identifier, VpnMap vpnMap) { + public void add(InstanceIdentifier identifier, VpnMap vpnMap) { Uuid vpnUuid = vpnMap.getVpnId(); String vpnName = vpnUuid.getValue(); if (vpnMap.getRouterIds() != null) { @@ -88,7 +90,7 @@ public class NatVpnMapsChangeListener extends AsyncDataTreeChangeListenerBase identifier, VpnMap vpnMap) { + public void remove(InstanceIdentifier identifier, VpnMap vpnMap) { Uuid vpnUuid = vpnMap.getVpnId(); String vpnName = vpnUuid.getValue(); if (vpnMap.getRouterIds() != null) { @@ -103,7 +105,7 @@ public class NatVpnMapsChangeListener extends AsyncDataTreeChangeListenerBase identifier, VpnMap original, VpnMap updated) { + public void update(InstanceIdentifier identifier, VpnMap original, VpnMap updated) { Uuid vpnUuid = updated.getVpnId(); String vpnName = vpnUuid.getValue(); @@ -147,11 +149,6 @@ public class NatVpnMapsChangeListener extends AsyncDataTreeChangeListenerBase { +public class RouterDpnChangeListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, final DpnVpninterfacesList dpnInfo) { + public void add(final InstanceIdentifier 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 identifier, DpnVpninterfacesList dpnInfo) { + public void remove(InstanceIdentifier 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 identifier, DpnVpninterfacesList original, + public void update(InstanceIdentifier identifier, DpnVpninterfacesList original, DpnVpninterfacesList update) { LOG.trace("Update key: {}, original: {}, update: {}", update.key(), original, update); } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/RouterPortsListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/RouterPortsListener.java index ce48e4e0cf..b9edf240dc 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/RouterPortsListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/RouterPortsListener.java @@ -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 { +public class RouterPortsListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, final RouterPorts routerPorts) { + public void add(final InstanceIdentifier identifier, final RouterPorts routerPorts) { LOG.trace("add : key:{} value:{}",routerPorts.key(), routerPorts); Optional optRouterPorts = SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker, @@ -96,7 +92,7 @@ public class RouterPortsListener } @Override - protected void remove(InstanceIdentifier identifier, RouterPorts routerPorts) { + public void remove(InstanceIdentifier 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 identifier, RouterPorts original, RouterPorts update) { + public void update(InstanceIdentifier identifier, RouterPorts original, RouterPorts update) { LOG.trace("Update : key: {}, original:{}, update:{}",update.key(), original, update); } } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SNATDefaultRouteProgrammer.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SNATDefaultRouteProgrammer.java index 9f9aa0fc38..81e28f8160 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SNATDefaultRouteProgrammer.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SNATDefaultRouteProgrammer.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatExternalRoutersListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatExternalRoutersListener.java index 2be87f8a1a..73013b7ae2 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatExternalRoutersListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatExternalRoutersListener.java @@ -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 { +public class SnatExternalRoutersListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Routers routers) { + public void add(InstanceIdentifier 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 identifier, Routers original, Routers update) { + public void update(InstanceIdentifier 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 identifier, Routers router) { + public void remove(InstanceIdentifier 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; - } } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatServiceImplFactory.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatServiceImplFactory.java index 7da7b391a8..ec8881f79f 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatServiceImplFactory.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatServiceImplFactory.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SubnetGwMacChangeListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SubnetGwMacChangeListener.java index 8c4435d3d4..4f219ee13b 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SubnetGwMacChangeListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SubnetGwMacChangeListener.java @@ -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 { +public class SubnetGwMacChangeListener extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.builder(LearntVpnVipToPortData.class).child(LearntVpnVipToPort.class).build(); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void remove(InstanceIdentifier key, LearntVpnVipToPort learntVpnVipToPort) { + public void remove(InstanceIdentifier key, LearntVpnVipToPort learntVpnVipToPort) { } @Override - protected void update(InstanceIdentifier key, LearntVpnVipToPort origLearntVpnVipToPort, + public void update(InstanceIdentifier key, LearntVpnVipToPort origLearntVpnVipToPort, LearntVpnVipToPort updatedLearntVpnVipToPort) { handleSubnetGwIpChange(updatedLearntVpnVipToPort); } @Override - protected void add(InstanceIdentifier key, LearntVpnVipToPort learntVpnVipToPort) { + public void add(InstanceIdentifier key, LearntVpnVipToPort learntVpnVipToPort) { handleSubnetGwIpChange(learntVpnVipToPort); } - @Override - protected SubnetGwMacChangeListener getDataTreeChangeListener() { - return this; - } - private void handleSubnetGwIpChange(LearntVpnVipToPort learntVpnVipToPort) { String macAddress = learntVpnVipToPort.getMacAddress(); if (macAddress == null) { diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SubnetmapListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SubnetmapListener.java index 39b2fdace3..485bceb816 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SubnetmapListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SubnetmapListener.java @@ -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 { +public class SubnetmapListener extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(Subnetmaps.class).child(Subnetmap.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void remove(InstanceIdentifier identifier, Subnetmap subnetmap) { + public void remove(InstanceIdentifier identifier, Subnetmap subnetmap) { LOG.trace("remove key: {} value: {}", subnetmap.key(), subnetmap); natServiceCounters.subnetmapRemove(); externalNetworkGroupInstaller.removeExtNetGroupEntries(subnetmap); } @Override - protected void update(InstanceIdentifier identifier, + public void update(InstanceIdentifier 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 identifier, Subnetmap subnetmap) { + public void add(InstanceIdentifier identifier, Subnetmap subnetmap) { LOG.trace("add key: {} value: {}", subnetmap.key(), subnetmap); natServiceCounters.subnetmapAdd(); externalNetworkGroupInstaller.installExtNetGroupEntries(subnetmap); } - - @Override - protected SubnetmapListener getDataTreeChangeListener() { - return this; - } } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/UpgradeStateListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/UpgradeStateListener.java index 29de7588e4..929240e855 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/UpgradeStateListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/UpgradeStateListener.java @@ -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); diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VipStateTracker.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VipStateTracker.java index 55933e7983..da28854d8b 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VipStateTracker.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VipStateTracker.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VpnFloatingIpHandler.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VpnFloatingIpHandler.java index 8d1d8a7ff2..075cbfe941 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VpnFloatingIpHandler.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VpnFloatingIpHandler.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VxlanGreConntrackBasedSnatService.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VxlanGreConntrackBasedSnatService.java index 40509c4abe..e2e1c310ae 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VxlanGreConntrackBasedSnatService.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VxlanGreConntrackBasedSnatService.java @@ -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; diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/rpcservice/NatRpcServiceImpl.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/rpcservice/NatRpcServiceImpl.java index 2aad5b3539..8d182d7b3e 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/rpcservice/NatRpcServiceImpl.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/rpcservice/NatRpcServiceImpl.java @@ -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; diff --git a/natservice/impl/src/main/resources/OSGI-INF/blueprint/commands.xml b/natservice/impl/src/main/resources/OSGI-INF/blueprint/commands.xml index b7bc4d20cd..c0bba272f8 100644 --- a/natservice/impl/src/main/resources/OSGI-INF/blueprint/commands.xml +++ b/natservice/impl/src/main/resources/OSGI-INF/blueprint/commands.xml @@ -2,8 +2,8 @@ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"> + interface="org.opendaylight.mdsal.binding.api.DataBroker" + odl:type="default"/> diff --git a/natservice/impl/src/main/resources/OSGI-INF/blueprint/natservice.xml b/natservice/impl/src/main/resources/OSGI-INF/blueprint/natservice.xml index 32adc3a828..8e0195dc0e 100644 --- a/natservice/impl/src/main/resources/OSGI-INF/blueprint/natservice.xml +++ b/natservice/impl/src/main/resources/OSGI-INF/blueprint/natservice.xml @@ -5,7 +5,7 @@ odl:use-default-for-reference-types="true"> diff --git a/neutronvpn/api/pom.xml b/neutronvpn/api/pom.xml index 94e8258172..cdd60e212c 100644 --- a/neutronvpn/api/pom.xml +++ b/neutronvpn/api/pom.xml @@ -22,10 +22,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html 4.0.0 - + org.opendaylight.genius mdsalutil-api @@ -48,5 +48,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html org.opendaylight.yangtools yang-common + + org.opendaylight.genius + mdsalutil-api + 0.9.0-SNAPSHOT + diff --git a/neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/api/utils/ChangeUtils.java b/neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/api/utils/ChangeUtils.java index b72758e989..0e064a29e1 100644 --- a/neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/api/utils/ChangeUtils.java +++ b/neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/api/utils/ChangeUtils.java @@ -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; diff --git a/neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/api/utils/NeutronUtils.java b/neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/api/utils/NeutronUtils.java index 315731bc71..32ae19b5da 100644 --- a/neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/api/utils/NeutronUtils.java +++ b/neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/api/utils/NeutronUtils.java @@ -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; diff --git a/neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/interfaces/INeutronVpnManager.java b/neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/interfaces/INeutronVpnManager.java index a8ce8d8092..81c3537966 100644 --- a/neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/interfaces/INeutronVpnManager.java +++ b/neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/interfaces/INeutronVpnManager.java @@ -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 showVpnConfigCLI(Uuid vuuid) throws InterruptedException, ExecutionException; - List showNeutronPortsCLI() throws ReadFailedException; + List showNeutronPortsCLI() throws ExecutionException, InterruptedException; Network getNeutronNetwork(Uuid networkId); diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/HostConfigCache.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/HostConfigCache.java index 5e6e824aaf..b2f5186d3d 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/HostConfigCache.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/HostConfigCache.java @@ -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; diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronBgpvpnChangeListener.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronBgpvpnChangeListener.java index 32322245c3..887c937c92 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronBgpvpnChangeListener.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronBgpvpnChangeListener.java @@ -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 { +public class NeutronBgpvpnChangeListener extends AbstractAsyncDataTreeChangeListener { 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 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 bgpvpnType) { @@ -94,7 +92,7 @@ public class NeutronBgpvpnChangeListener extends AsyncDataTreeChangeListenerBase @Override // TODO Clean up the exception handling @SuppressWarnings("checkstyle:IllegalCatch") - protected void add(InstanceIdentifier identifier, Bgpvpn input) { + public void add(InstanceIdentifier 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 identifier, Bgpvpn input) { + public void remove(InstanceIdentifier 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 identifier, Bgpvpn original, Bgpvpn update) { + public void update(InstanceIdentifier identifier, Bgpvpn original, Bgpvpn update) { LOG.trace("Update Bgpvpn : key: {}, value={}", identifier, update); Uuid vpnId = update.getUuid(); if (isBgpvpnTypeL3(update.getType())) { diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronFloatingToFixedIpMappingChangeListener.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronFloatingToFixedIpMappingChangeListener.java index 79767de0b5..a0ed08914b 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronFloatingToFixedIpMappingChangeListener.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronFloatingToFixedIpMappingChangeListener.java @@ -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 { +public class NeutronFloatingToFixedIpMappingChangeListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Floatingip input) { + public void add(InstanceIdentifier 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 identifier, Floatingip input) { + public void remove(InstanceIdentifier 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 identifier, Floatingip original, Floatingip update) { + public void update(InstanceIdentifier 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); } diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronHostConfigChangeListener.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronHostConfigChangeListener.java index 77bc810854..cb118ce9c7 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronHostConfigChangeListener.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronHostConfigChangeListener.java @@ -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 { +public class NeutronHostConfigChangeListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Node del) { + public void remove(InstanceIdentifier identifier, Node del) { updateHostConfig(del, Action.DELETE); } @Override - protected void update(InstanceIdentifier identifier, Node original, Node update) { + public void update(InstanceIdentifier identifier, Node original, Node update) { updateHostConfig(update, Action.UPDATE); } @Override - protected void add(InstanceIdentifier identifier, Node add) { + public void add(InstanceIdentifier identifier, Node add) { updateHostConfig(add, Action.ADD); } diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronNetworkChangeListener.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronNetworkChangeListener.java index aa2964fba2..cf2511e745 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronNetworkChangeListener.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronNetworkChangeListener.java @@ -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 { +public class NeutronNetworkChangeListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Network input) { + public void add(InstanceIdentifier 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 identifier, Network input) { + public void remove(InstanceIdentifier 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 identifier, Network original, Network update) { + public void update(InstanceIdentifier 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 id = createElanInstanceIdentifier(elanInstanceName); - Optional existingElanInstance = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, - id); - if (existingElanInstance.isPresent()) { - return existingElanInstance.get(); + Optional 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 segmentType = NeutronvpnUtils.getSegmentTypeFromNeutronNetwork(input); String segmentationId = NeutronvpnUtils.getSegmentationIdFromNeutronNetwork(input); diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListener.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListener.java index 5a9c737848..5f4f768338 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListener.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListener.java @@ -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 { +public class NeutronPortChangeListener extends AbstractAsyncDataTreeChangeListener { 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

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 identifier, Port input) { + public void add(InstanceIdentifier 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

identifier, Port input) { + public void remove(InstanceIdentifier 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

identifier, Port original, Port update) { + public void update(InstanceIdentifier 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

routersId = NeutronvpnUtils.buildExtRoutersIdentifier(routerId); - Optional optionalRouter = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, routersId); - if (!optionalRouter.isPresent()) { - return; - } + Optional 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

{ +public class NeutronRouterChangeListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Router input) { + public void add(InstanceIdentifier 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 identifier, Router input) { + public void remove(InstanceIdentifier 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 identifier, Router original, Router update) { + public void update(InstanceIdentifier identifier, Router original, Router update) { LOG.trace("Updating Router : key: {}, original value={}, update value={}", identifier, original, update); neutronvpnUtils.addToRouterCache(update); Uuid routerId = update.getUuid(); diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityGroupListener.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityGroupListener.java index d6c0b30c46..0453ed8a94 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityGroupListener.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityGroupListener.java @@ -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 { +public class NeutronSecurityGroupListener extends AbstractAsyncDataTreeChangeListener { 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 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 key, SecurityGroup securityGroup) { + public void remove(InstanceIdentifier key, SecurityGroup securityGroup) { LOG.trace("Removing securityGroup: {}", securityGroup); InstanceIdentifier identifier = getAclInstanceIdentifier(securityGroup); String securityGroupId = securityGroup.key().getUuid().getValue(); @@ -82,13 +84,13 @@ public class NeutronSecurityGroupListener } @Override - protected void update(InstanceIdentifier key, SecurityGroup dataObjectModificationBefore, + public void update(InstanceIdentifier key, SecurityGroup dataObjectModificationBefore, SecurityGroup dataObjectModificationAfter) { LOG.debug("Do nothing"); } @Override - protected void add(InstanceIdentifier instanceIdentifier, SecurityGroup securityGroup) { + public void add(InstanceIdentifier instanceIdentifier, SecurityGroup securityGroup) { LOG.trace("Adding securityGroup: {}", securityGroup); String securityGroupId = securityGroup.key().getUuid().getValue(); InstanceIdentifier identifier = getAclInstanceIdentifier(securityGroup); @@ -100,11 +102,6 @@ public class NeutronSecurityGroupListener }); } - @Override - protected NeutronSecurityGroupListener getDataTreeChangeListener() { - return this; - } - private InstanceIdentifier getAclInstanceIdentifier(SecurityGroup securityGroup) { return InstanceIdentifier .builder(AccessLists.class).child(Acl.class, diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityGroupUtils.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityGroupUtils.java index fc50f62815..5035ffd0fb 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityGroupUtils.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityGroupUtils.java @@ -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 aclInstanceIdentifier) { - return MDSALUtil.read(LogicalDatastoreType.CONFIGURATION, aclInstanceIdentifier, broker).orNull(); + return MDSALUtil.read(LogicalDatastoreType.CONFIGURATION, aclInstanceIdentifier, broker).orElse(null); } } diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityRuleListener.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityRuleListener.java index dbdafa2c8e..b9edd8d862 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityRuleListener.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityRuleListener.java @@ -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 { +public class NeutronSecurityRuleListener extends AbstractAsyncDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(NeutronSecurityRuleListener.class); private static final ImmutableBiMap, Class> @@ -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 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 instanceIdentifier, SecurityRule securityRule) { + public void add(InstanceIdentifier 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 instanceIdentifier, SecurityRule securityRule) { + public void remove(InstanceIdentifier instanceIdentifier, SecurityRule securityRule) { LOG.trace("removed securityRule: {}", securityRule); InstanceIdentifier identifier = getAceInstanceIdentifier(securityRule); try { @@ -253,14 +254,9 @@ public class NeutronSecurityRuleListener } @Override - protected void update(InstanceIdentifier instanceIdentifier, + public void update(InstanceIdentifier 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; - } } diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSubnetChangeListener.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSubnetChangeListener.java index 0087e1c466..71fb1ae254 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSubnetChangeListener.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSubnetChangeListener.java @@ -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 { +public class NeutronSubnetChangeListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Subnet input) { + public void add(InstanceIdentifier 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 identifier, Subnet input) { + public void remove(InstanceIdentifier 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 identifier, Subnet original, Subnet update) { + public void update(InstanceIdentifier 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()); } diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronTrunkChangeListener.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronTrunkChangeListener.java index 3a479e93a9..ca9308891b 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronTrunkChangeListener.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronTrunkChangeListener.java @@ -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 { +public class NeutronTrunkChangeListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Trunk input) { + public void add(InstanceIdentifier identifier, Trunk input) { Preconditions.checkNotNull(input.getPortId()); LOG.trace("Adding Trunk : key: {}, value={}", identifier, input); List subPorts = input.getSubPorts(); @@ -93,7 +91,7 @@ public class NeutronTrunkChangeListener extends AsyncDataTreeChangeListenerBase< } @Override - protected void remove(InstanceIdentifier identifier, Trunk input) { + public void remove(InstanceIdentifier identifier, Trunk input) { Preconditions.checkNotNull(input.getPortId()); LOG.trace("Removing Trunk : key: {}, value={}", identifier, input); List subPorts = input.getSubPorts(); @@ -103,7 +101,7 @@ public class NeutronTrunkChangeListener extends AsyncDataTreeChangeListenerBase< } @Override - protected void update(InstanceIdentifier identifier, Trunk original, Trunk update) { + public void update(InstanceIdentifier identifier, Trunk original, Trunk update) { List updatedSubPorts = update.getSubPorts(); if (updatedSubPorts == null) { updatedSubPorts = Collections.emptyList(); diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManager.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManager.java index 11124a99e8..ede78d728c 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManager.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManager.java @@ -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.success().withResult(opBuilder.build()).build()); - } catch (ReadFailedException ex) { + } catch (ExecutionException | InterruptedException ex) { result.set(RpcResultBuilder.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 showNeutronPortsCLI() throws ReadFailedException { + public List showNeutronPortsCLI() throws ExecutionException, InterruptedException { List 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 existingVpnName = Optional.of(primaryRd); Optional 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; } diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManagerImpl.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManagerImpl.java index afc5eb8102..11347beef5 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManagerImpl.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManagerImpl.java @@ -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 showNeutronPortsCLI() throws ReadFailedException { + public List showNeutronPortsCLI() throws ExecutionException, InterruptedException { return nvManager.showNeutronPortsCLI(); } diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnNatManager.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnNatManager.java index fa51a32a11..97fe21e36d 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnNatManager.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnNatManager.java @@ -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); } diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnUtils.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnUtils.java index 9ccdd3d85b..3231943ad0 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnUtils.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnUtils.java @@ -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 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 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 Optional read(LogicalDatastoreType datastoreType, InstanceIdentifier 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 getInterVpnLinkByEndpointIp(String endpointIp) { InstanceIdentifier interVpnLinksIid = InstanceIdentifier.builder(InterVpnLinks.class).build(); - Optional 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 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 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 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> 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>(settableFuture) { @Override diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/UpgradeStateListener.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/UpgradeStateListener.java index f0aef8d0f6..09cb264503 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/UpgradeStateListener.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/UpgradeStateListener.java @@ -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; } diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/evpn/manager/NeutronEvpnManager.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/evpn/manager/NeutronEvpnManager.java index afa3eb802f..749a6dc264 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/evpn/manager/NeutronEvpnManager.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/evpn/manager/NeutronEvpnManager.java @@ -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.failed().withError(RpcError.ErrorType.APPLICATION, "Error reading the VPN map for " + vpnMapIdentifier, e).build()); diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/evpn/utils/NeutronEvpnUtils.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/evpn/utils/NeutronEvpnUtils.java index aade8be41e..a43632c347 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/evpn/utils/NeutronEvpnUtils.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/evpn/utils/NeutronEvpnUtils.java @@ -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 id = InstanceIdentifier.builder(EvpnRdToNetworks.class) .child(EvpnRdToNetwork.class, new EvpnRdToNetworkKey(rd)).build(); diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/l2gw/AddL2GwDevicesToTransportZoneJob.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/l2gw/AddL2GwDevicesToTransportZoneJob.java index 4a13fad86b..a9ecf1827a 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/l2gw/AddL2GwDevicesToTransportZoneJob.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/l2gw/AddL2GwDevicesToTransportZoneJob.java @@ -22,7 +22,7 @@ import org.slf4j.LoggerFactory; /** * The Class AddL2GwDevicesToTransportZoneJob. */ -public class AddL2GwDevicesToTransportZoneJob implements Callable>> { +public class AddL2GwDevicesToTransportZoneJob implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(AddL2GwDevicesToTransportZoneJob.class); private final ItmRpcService itmRpcService; diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/l2gw/L2GwTransportZoneListener.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/l2gw/L2GwTransportZoneListener.java index c01289b612..d1ad6a6614 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/l2gw/L2GwTransportZoneListener.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/l2gw/L2GwTransportZoneListener.java @@ -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 { +public class L2GwTransportZoneListener extends AbstractAsyncDataTreeChangeListener { 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 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 key, TransportZone dataObjectModification) { + public void remove(InstanceIdentifier key, TransportZone dataObjectModification) { // do nothing } @@ -93,7 +87,7 @@ public class L2GwTransportZoneListener * org.opendaylight.yangtools.yang.binding.DataObject) */ @Override - protected void update(InstanceIdentifier key, TransportZone dataObjectModificationBefore, + public void update(InstanceIdentifier 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 key, TransportZone tzNew) { + public void add(InstanceIdentifier 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; - } } diff --git a/neutronvpn/impl/src/main/resources/OSGI-INF/blueprint/neutronvpn.xml b/neutronvpn/impl/src/main/resources/OSGI-INF/blueprint/neutronvpn.xml index 4b02df85ff..793d850582 100644 --- a/neutronvpn/impl/src/main/resources/OSGI-INF/blueprint/neutronvpn.xml +++ b/neutronvpn/impl/src/main/resources/OSGI-INF/blueprint/neutronvpn.xml @@ -4,7 +4,7 @@ odl:use-default-for-reference-types="true"> diff --git a/neutronvpn/impl/src/test/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListenerTest.java b/neutronvpn/impl/src/test/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListenerTest.java index 6c08cdea5f..2ac4da2b85 100644 --- a/neutronvpn/impl/src/test/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListenerTest.java +++ b/neutronvpn/impl/src/test/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListenerTest.java @@ -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), diff --git a/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/DhcpConfigureCommand.java b/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/DhcpConfigureCommand.java index 62d8da89b5..b799cf72ca 100644 --- a/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/DhcpConfigureCommand.java +++ b/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/DhcpConfigureCommand.java @@ -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; diff --git a/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/DhcpShowCommand.java b/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/DhcpShowCommand.java index d44bbd8af6..3f41ab4bab 100644 --- a/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/DhcpShowCommand.java +++ b/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/DhcpShowCommand.java @@ -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; diff --git a/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/ShowSubnet.java b/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/ShowSubnet.java index 25449f51cb..4b6f8edae1 100644 --- a/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/ShowSubnet.java +++ b/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/ShowSubnet.java @@ -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 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 subnetOpDataEntryList = new ArrayList<>(); InstanceIdentifier subnetmapsid = InstanceIdentifier.builder(Subnetmaps.class).build(); InstanceIdentifier subOpIdentifier = InstanceIdentifier.builder(SubnetOpData.class).build(); diff --git a/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/ShowVpnIpToPort.java b/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/ShowVpnIpToPort.java index c0f6b0b95d..d311a86cf6 100644 --- a/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/ShowVpnIpToPort.java +++ b/neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/ShowVpnIpToPort.java @@ -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 neutronVpnPortipPortDataIdentifier = InstanceIdentifier .builder(NeutronVpnPortipPortData.class).build(); Optional 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 learntVpnVipPortDataIdentifier = InstanceIdentifier .builder(LearntVpnVipToPortData.class).build(); Optional optionalLearntVpnPort = syncReadOptional(dataBroker, OPERATIONAL, diff --git a/neutronvpn/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/neutronvpn/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml index 87394b8ebb..9352a0837e 100644 --- a/neutronvpn/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml +++ b/neutronvpn/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -14,7 +14,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html availability="optional"/> - diff --git a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyAceFlowProgrammer.java b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyAceFlowProgrammer.java index 1eeec5fae1..e0f9f0d8f3 100644 --- a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyAceFlowProgrammer.java +++ b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyAceFlowProgrammer.java @@ -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 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 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(); } } diff --git a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyRouteFlowProgrammer.java b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyRouteFlowProgrammer.java index 6945e60d6d..aedbe67410 100644 --- a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyRouteFlowProgrammer.java +++ b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyRouteFlowProgrammer.java @@ -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; diff --git a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyRouteGroupProgrammer.java b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyRouteGroupProgrammer.java index 6b56bce8f5..0f9ec46091 100644 --- a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyRouteGroupProgrammer.java +++ b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyRouteGroupProgrammer.java @@ -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; diff --git a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyAceChangeListener.java b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyAceChangeListener.java index 2a1874f567..bac046dae9 100644 --- a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyAceChangeListener.java +++ b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyAceChangeListener.java @@ -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; diff --git a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyNodeListener.java b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyNodeListener.java index 50d1615c08..a375d44efb 100644 --- a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyNodeListener.java +++ b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyNodeListener.java @@ -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; diff --git a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyProfileChangeListener.java b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyProfileChangeListener.java index 918f144ab7..5eae4e2243 100644 --- a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyProfileChangeListener.java +++ b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyProfileChangeListener.java @@ -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; diff --git a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/TunnelStateChangeListener.java b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/TunnelStateChangeListener.java index c360f15854..6209595e83 100644 --- a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/TunnelStateChangeListener.java +++ b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/TunnelStateChangeListener.java @@ -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; diff --git a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/TunnelUnderlayNetworkChangeListener.java b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/TunnelUnderlayNetworkChangeListener.java index 80d0507c89..bcffbbc529 100644 --- a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/TunnelUnderlayNetworkChangeListener.java +++ b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/TunnelUnderlayNetworkChangeListener.java @@ -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; diff --git a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/UnderlayNetworkDpnListener.java b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/UnderlayNetworkDpnListener.java index c27a00f27d..c0e2de38f6 100644 --- a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/UnderlayNetworkDpnListener.java +++ b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/UnderlayNetworkDpnListener.java @@ -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; diff --git a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/util/PolicyServiceFlowUtil.java b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/util/PolicyServiceFlowUtil.java index 032617ff81..adecf00414 100644 --- a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/util/PolicyServiceFlowUtil.java +++ b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/util/PolicyServiceFlowUtil.java @@ -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; diff --git a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/util/PolicyServiceUtil.java b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/util/PolicyServiceUtil.java index d4345af43d..ff98e53fdc 100644 --- a/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/util/PolicyServiceUtil.java +++ b/policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/util/PolicyServiceUtil.java @@ -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 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 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 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 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 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 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 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() diff --git a/policyservice/impl/src/main/resources/OSGI-INF/blueprint/policyservice.xml b/policyservice/impl/src/main/resources/OSGI-INF/blueprint/policyservice.xml index 722db1d108..1f610ce8cb 100644 --- a/policyservice/impl/src/main/resources/OSGI-INF/blueprint/policyservice.xml +++ b/policyservice/impl/src/main/resources/OSGI-INF/blueprint/policyservice.xml @@ -5,7 +5,7 @@ odl:use-default-for-reference-types="true"> + interface="org.opendaylight.mdsal.binding.api.DataBroker" /> { +public class QosAlertConfigListener extends AbstractClusteredAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(QosalertConfig.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void remove(InstanceIdentifier identifier, QosalertConfig del) { + public void remove(InstanceIdentifier identifier, QosalertConfig del) { LOG.debug("QosalertConfig removed: {}", del); qosAlertManager.restoreDefaultConfig(); } @Override - protected void update(InstanceIdentifier identifier, QosalertConfig original, + public void update(InstanceIdentifier identifier, QosalertConfig original, QosalertConfig update) { LOG.debug("QosalertConfig changed to {}", update); qosAlertManager.setQosalertConfig(update); } @Override - protected void add(InstanceIdentifier identifier, QosalertConfig add) { + public void add(InstanceIdentifier identifier, QosalertConfig add) { LOG.debug("QosalertConfig added {}", add); qosAlertManager.setQosalertConfig(add); } - - @Override - protected QosAlertConfigListener getDataTreeChangeListener() { - return this; - } - } diff --git a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosAlertManager.java b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosAlertManager.java index 5f6232e94c..2fe9cad325 100644 --- a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosAlertManager.java +++ b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosAlertManager.java @@ -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; diff --git a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosInterfaceStateChangeListener.java b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosInterfaceStateChangeListener.java index 66a10fa313..fe6acdb814 100644 --- a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosInterfaceStateChangeListener.java +++ b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosInterfaceStateChangeListener.java @@ -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 implements RecoverableListener { +public class QosInterfaceStateChangeListener extends AbstractClusteredAsyncDataTreeChangeListener + 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 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 identifier, Interface intrf) { + public void add(InstanceIdentifier 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 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 identifier, Interface intrf) { + public void remove(InstanceIdentifier 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 identifier, Interface original, Interface update) { + public void update(InstanceIdentifier 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); diff --git a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronNetworkChangeListener.java b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronNetworkChangeListener.java index 54ffb15585..8febbe0a25 100644 --- a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronNetworkChangeListener.java +++ b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronNetworkChangeListener.java @@ -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 implements RecoverableListener { +public class QosNeutronNetworkChangeListener extends AbstractClusteredAsyncDataTreeChangeListener + 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 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 instanceIdentifier, Network network) { + public void remove(InstanceIdentifier instanceIdentifier, Network network) { qosNeutronUtils.removeFromNetworkCache(network); } @Override - protected void update(InstanceIdentifier instanceIdentifier, Network original, Network update) { + public void update(InstanceIdentifier 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 instanceIdentifier, Network network) { + public void add(InstanceIdentifier instanceIdentifier, Network network) { qosNeutronUtils.addToNetworkCache(network); QosNetworkExtension networkQos = network.augmentation(QosNetworkExtension.class); diff --git a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronPortChangeListener.java b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronPortChangeListener.java index 19f243e3d9..08ba90b9f7 100644 --- a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronPortChangeListener.java +++ b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronPortChangeListener.java @@ -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 implements RecoverableListener { +public class QosNeutronPortChangeListener extends AbstractClusteredAsyncDataTreeChangeListener + 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 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 instanceIdentifier, Port port) { + public void add(InstanceIdentifier instanceIdentifier, Port port) { qosNeutronUtils.addToPortCache(port); } @Override - protected void remove(InstanceIdentifier instanceIdentifier, Port port) { + public void remove(InstanceIdentifier instanceIdentifier, Port port) { qosNeutronUtils.removeFromPortCache(port); } @Override - protected void update(InstanceIdentifier instanceIdentifier, Port original, Port update) { + public void update(InstanceIdentifier instanceIdentifier, Port original, Port update) { qosNeutronUtils.addToPortCache(update); // check for QoS updates QosPortExtension updateQos = update.augmentation(QosPortExtension.class); diff --git a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronUtils.java b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronUtils.java index 2b33946d47..7ffe635a1e 100644 --- a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronUtils.java +++ b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronUtils.java @@ -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 bridgeEntryInstanceIdentifier) { - return MDSALUtil.read(LogicalDatastoreType.CONFIGURATION, bridgeEntryInstanceIdentifier, dataBroker).orNull(); + return MDSALUtil.read(LogicalDatastoreType.CONFIGURATION, bridgeEntryInstanceIdentifier, dataBroker) + .orElse(null); } @Nullable private BridgeRefEntry getBridgeRefEntryFromOperDS(InstanceIdentifier 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 diff --git a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNodeListener.java b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNodeListener.java index 9ce5699530..b7758a9e00 100644 --- a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNodeListener.java +++ b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNodeListener.java @@ -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 +public class QosNodeListener extends AbstractAsyncDataTreeChangeListener implements RecoverableListener { private static final Logger LOG = LoggerFactory.getLogger(QosNodeListener.class); @@ -48,7 +49,9 @@ public class QosNodeListener extends AsyncDataTreeChangeListenerBase getWildCardPath() { - return InstanceIdentifier.create(Nodes.class).child(Node.class).augmentation(FlowCapableNode.class); + public void deregisterListener() { + super.close(); } @Override - protected void remove(InstanceIdentifier key, FlowCapableNode dataObjectModification) { + public void remove(InstanceIdentifier key, FlowCapableNode dataObjectModification) { //do nothing } @Override - protected void update(InstanceIdentifier key, FlowCapableNode dataObjectModificationBefore, + public void update(InstanceIdentifier key, FlowCapableNode dataObjectModificationBefore, FlowCapableNode dataObjectModificationAfter) { //do nothing } @Override - protected void add(InstanceIdentifier key, FlowCapableNode dataObjectModification) { + public void add(InstanceIdentifier 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 matches = new ArrayList<>(); List instructions = new ArrayList<>(); diff --git a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosPolicyChangeListener.java b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosPolicyChangeListener.java index 28f2dc2ab1..04878b80c5 100644 --- a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosPolicyChangeListener.java +++ b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosPolicyChangeListener.java @@ -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 implements RecoverableListener { +public class QosPolicyChangeListener extends AbstractClusteredAsyncDataTreeChangeListener + 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 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> 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> changes) { Map, 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 identifier, QosPolicy input) { + public void add(InstanceIdentifier 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 identifier, DscpmarkingRules input) { +/* private void add(InstanceIdentifier 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 identifier, QosPolicy input) { + public void remove(InstanceIdentifier identifier, QosPolicy input) { LOG.debug("Removing QosPolicy : key: {}, value={}", identifier.firstKeyOf(QosPolicy.class).getUuid().getValue(), input); qosNeutronUtils.removeFromQosPolicyCache(input); } - private void remove(InstanceIdentifier identifier, BandwidthLimitRules input) { +/* private void remove(InstanceIdentifier 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 identifier,DscpmarkingRules input) { +/* private void remove(InstanceIdentifier 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 identifier, QosPolicy original, QosPolicy update) { + public void update(InstanceIdentifier 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 identifier, BandwidthLimitRules original, +/* private void update(InstanceIdentifier 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 identifier, DscpmarkingRules original, +/* private void update(InstanceIdentifier 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)) { diff --git a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosTerminationPointListener.java b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosTerminationPointListener.java index 4cea57824c..b8f6273a1b 100644 --- a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosTerminationPointListener.java +++ b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosTerminationPointListener.java @@ -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 { + AbstractClusteredAsyncDataTreeChangeListener { 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 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 instanceIdentifier, + public void remove(InstanceIdentifier instanceIdentifier, OvsdbTerminationPointAugmentation tp) { if (isBandwidthRuleApplied(tp)) { String ifaceId = getIfaceId(tp); @@ -115,7 +118,7 @@ public class QosTerminationPointListener extends } @Override - protected void update(InstanceIdentifier instanceIdentifier, + public void update(InstanceIdentifier instanceIdentifier, OvsdbTerminationPointAugmentation original, OvsdbTerminationPointAugmentation update) { String ifaceId = getIfaceId(update); @@ -149,7 +152,7 @@ public class QosTerminationPointListener extends } @Override - protected void add(InstanceIdentifier instanceIdentifier, + public void add(InstanceIdentifier 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 identifier, OvsdbTerminationPointAugmentation update, Port port) { QosPolicy qosPolicy = qosNeutronUtils.getQosPolicy(port); diff --git a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/UuidUtil.java b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/UuidUtil.java index bcea351e30..5506d31da9 100644 --- a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/UuidUtil.java +++ b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/UuidUtil.java @@ -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(); } } } diff --git a/qosservice/impl/src/main/resources/OSGI-INF/blueprint/qosservice.xml b/qosservice/impl/src/main/resources/OSGI-INF/blueprint/qosservice.xml index d4a48c5b7e..def8d3ef87 100644 --- a/qosservice/impl/src/main/resources/OSGI-INF/blueprint/qosservice.xml +++ b/qosservice/impl/src/main/resources/OSGI-INF/blueprint/qosservice.xml @@ -12,7 +12,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html odl:use-default-for-reference-types="true"> diff --git a/qosservice/impl/src/test/java/org/opendaylight/netvirt/qosservice/UuidUtilTest.java b/qosservice/impl/src/test/java/org/opendaylight/netvirt/qosservice/UuidUtilTest.java index 960dec0e98..cdf11151e0 100644 --- a/qosservice/impl/src/test/java/org/opendaylight/netvirt/qosservice/UuidUtilTest.java +++ b/qosservice/impl/src/test/java/org/opendaylight/netvirt/qosservice/UuidUtilTest.java @@ -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) diff --git a/statemanager/impl/pom.xml b/statemanager/impl/pom.xml index 41ba195ca0..471b630bb0 100644 --- a/statemanager/impl/pom.xml +++ b/statemanager/impl/pom.xml @@ -31,10 +31,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html javax.inject true - + ${project.groupId} bgpmanager-api diff --git a/statemanager/impl/src/main/java/org/opendaylight/netvirt/statemanager/StateManager.java b/statemanager/impl/src/main/java/org/opendaylight/netvirt/statemanager/StateManager.java index 4e4df67e16..4149b6f049 100644 --- a/statemanager/impl/src/main/java/org/opendaylight/netvirt/statemanager/StateManager.java +++ b/statemanager/impl/src/main/java/org/opendaylight/netvirt/statemanager/StateManager.java @@ -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; diff --git a/statemanager/impl/src/main/resources/OSGI-INF/blueprint/statemanager.xml b/statemanager/impl/src/main/resources/OSGI-INF/blueprint/statemanager.xml index 4283ee5b8b..4ed845e52b 100644 --- a/statemanager/impl/src/main/resources/OSGI-INF/blueprint/statemanager.xml +++ b/statemanager/impl/src/main/resources/OSGI-INF/blueprint/statemanager.xml @@ -4,7 +4,7 @@ odl:use-default-for-reference-types="true"> + interface="org.opendaylight.mdsal.binding.api.DataBroker" /> diff --git a/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/AbstractCountersService.java b/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/AbstractCountersService.java index 8597a928d8..65182498bd 100644 --- a/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/AbstractCountersService.java +++ b/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/AbstractCountersService.java @@ -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; diff --git a/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/CountersServiceInterfaceListener.java b/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/CountersServiceInterfaceListener.java index 7944eed883..2081e0c762 100644 --- a/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/CountersServiceInterfaceListener.java +++ b/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/CountersServiceInterfaceListener.java @@ -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; diff --git a/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/EgressCountersServiceImpl.java b/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/EgressCountersServiceImpl.java index 1c4188fa15..1653f598ec 100644 --- a/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/EgressCountersServiceImpl.java +++ b/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/EgressCountersServiceImpl.java @@ -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; diff --git a/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/IngressCountersServiceImpl.java b/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/IngressCountersServiceImpl.java index 674f7f8a68..c87be66a12 100644 --- a/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/IngressCountersServiceImpl.java +++ b/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/IngressCountersServiceImpl.java @@ -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; diff --git a/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/StatisticsImpl.java b/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/StatisticsImpl.java index e56f1ff4ef..197e6c13b1 100644 --- a/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/StatisticsImpl.java +++ b/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/StatisticsImpl.java @@ -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 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 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> result = SettableFuture.create(); ListenableFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(tx -> { Optional iecrcOpt = - tx.read(LogicalDatastoreType.CONFIGURATION, CountersServiceUtils.IECRC_IDENTIFIER).checkedGet(); + tx.read(LogicalDatastoreType.CONFIGURATION, CountersServiceUtils.IECRC_IDENTIFIER).get(); Optional 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 ingressRequestOpt = - tx.read(LogicalDatastoreType.CONFIGURATION, ingressPath).checkedGet(); + tx.read(LogicalDatastoreType.CONFIGURATION, ingressPath).get(); Optional 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, ReadFailedException> ingressRequestData = tx.read(LogicalDatastoreType.CONFIGURATION, ingressPath); CheckedFuture, ReadFailedException> egressRequestData = @@ -413,7 +413,7 @@ public class StatisticsImpl implements StatisticsService, ICountersInterfaceChan public void handleInterfaceRemoval(String interfaceId) { CheckedFuture, ReadFailedException> iecrc; CheckedFuture, 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> cleanAllElementCounterRequests( CleanAllElementCounterRequestsInput input) { - ReadOnlyTransaction tx = db.newReadOnlyTransaction(); + ReadTransaction tx = db.newReadOnlyTransaction(); CheckedFuture, ReadFailedException> iecrc = tx.read(LogicalDatastoreType.CONFIGURATION, CountersServiceUtils.IECRC_IDENTIFIER); CheckedFuture, ReadFailedException> eecrc = @@ -584,10 +584,10 @@ public class StatisticsImpl implements StatisticsService, ICountersInterfaceChan txRunner.callWithNewReadWriteTransactionAndSubmit(transaction -> { Optional iecrcOpt = transaction.read(LogicalDatastoreType.CONFIGURATION, - CountersServiceUtils.IECRC_IDENTIFIER).checkedGet(); + CountersServiceUtils.IECRC_IDENTIFIER).get(); Optional 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 path = InstanceIdentifier.create(IdPools.class).child(IdPool.class, new IdPoolKey(CountersServiceUtils.COUNTERS_PULL_NAME)); CheckedFuture, ReadFailedException> pool = diff --git a/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/StatisticsProvider.java b/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/StatisticsProvider.java index 4a6d242396..6a2b331d89 100644 --- a/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/StatisticsProvider.java +++ b/statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/StatisticsProvider.java @@ -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; diff --git a/statistics/impl/src/main/resources/OSGI-INF/blueprint/statistics.xml b/statistics/impl/src/main/resources/OSGI-INF/blueprint/statistics.xml index 9c68e7131d..e20104d554 100644 --- a/statistics/impl/src/main/resources/OSGI-INF/blueprint/statistics.xml +++ b/statistics/impl/src/main/resources/OSGI-INF/blueprint/statistics.xml @@ -9,12 +9,12 @@ odl:use-default-for-reference-types="true"> + interface="org.opendaylight.mdsal.binding.api.RpcProviderService" /> + interface="org.opendaylight.mdsal.binding.api.NotificationService" /> getMacAddressForInterface(DataBroker dataBroker, String interfaceName) { - Optional macAddressOptional = Optional.absent(); + Optional macAddressOptional = Optional.empty(); InstanceIdentifier ifStateId = @@ -171,7 +170,7 @@ public final class InterfaceUtils { } public static Optional getMacAddressFromInterfaceState(Interface ifState) { - Optional macAddressOptional = Optional.absent(); + Optional macAddressOptional = Optional.empty(); PhysAddress macAddress = ifState.getPhysAddress(); if (macAddress != null) { macAddressOptional = Optional.of(macAddress.getValue()); @@ -209,7 +208,7 @@ public final class InterfaceUtils { InstanceIdentifier path) { try { return SingleTransactionDataBroker.syncReadOptional(broker, datastoreType, path); - } catch (ReadFailedException e) { + } catch (ExecutionException | InterruptedException e) { throw new RuntimeException(e); } } diff --git a/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/VpnExtraRouteHelper.java b/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/VpnExtraRouteHelper.java index 4659d784d4..4a5b49d31a 100644 --- a/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/VpnExtraRouteHelper.java +++ b/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/VpnExtraRouteHelper.java @@ -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 getVpnExtraroutes(DataBroker broker, String vpnName, String vpnRd, String destPrefix) { InstanceIdentifier vpnExtraRoutesId = getVpnToExtrarouteVrfIdIdentifier(vpnName, vpnRd, destPrefix); - return MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, vpnExtraRoutesId); + Optional 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 getVpnExtraroutes(TypedReadTransaction operTx, String vpnName, @@ -80,11 +89,13 @@ public final class VpnExtraRouteHelper { List usedRds, String destPrefix) { List routes = new ArrayList<>(); for (String rd : usedRds) { - Optional extraRouteInfo = - MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, - getVpnToExtrarouteVrfIdIdentifier(vpnName, rd, destPrefix)); - if (extraRouteInfo.isPresent()) { - routes.add(extraRouteInfo.get()); + try { + Optional 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 getUsedRds(DataBroker broker, Uint32 vpnId, String destPrefix) { InstanceIdentifier usedRdsId = getUsedRdsIdentifier(vpnId, destPrefix); - Optional usedRds = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, usedRdsId); + Optional 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 getRdAllocatedForExtraRoute(DataBroker broker, Uint32 vpnId, String destPrefix, String nextHop) { InstanceIdentifier 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 getExtraRouteDestPrefixes(DataBroker broker, Uint32 vpnId) { - Optional optionalExtraRoutes = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, - getUsedRdsIdentifier(vpnId)); - List prefixes = - optionalExtraRoutes.isPresent() ? optionalExtraRoutes.get().getDestPrefixes() : null; - return prefixes == null ? Collections.emptyList() : prefixes; + try { + Optional optionalExtraRoutes = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, + getUsedRdsIdentifier(vpnId)); + List 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<>(); } } diff --git a/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/VpnHelper.java b/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/VpnHelper.java index f330e00714..4ddc01c42e 100644 --- a/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/VpnHelper.java +++ b/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/VpnHelper.java @@ -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 Optional read(DataBroker broker, LogicalDatastoreType datastoreType, InstanceIdentifier 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); diff --git a/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/intervpnlink/InterVpnLinkCache.java b/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/intervpnlink/InterVpnLinkCache.java index 24adfd12e5..3293d305e9 100644 --- a/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/intervpnlink/InterVpnLinkCache.java +++ b/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/intervpnlink/InterVpnLinkCache.java @@ -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; diff --git a/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/intervpnlink/InterVpnLinkDataComposite.java b/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/intervpnlink/InterVpnLinkDataComposite.java index e7aa720982..3ec633f6b6 100755 --- a/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/intervpnlink/InterVpnLinkDataComposite.java +++ b/vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/intervpnlink/InterVpnLinkDataComposite.java @@ -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 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 getFirstEndpointVpnUuid() { if (this.interVpnLinkCfg == null) { - return Optional.absent(); + return Optional.empty(); } return Optional.of(this.interVpnLinkCfg.getFirstEndpoint().getVpnUuid().getValue()); } public Optional getFirstEndpointIpAddr() { if (this.interVpnLinkCfg == null) { - return Optional.absent(); + return Optional.empty(); } return Optional.of(this.interVpnLinkCfg.getFirstEndpoint().getIpAddress().getValue()); } public Optional 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 getSecondEndpointVpnUuid() { if (!isComplete()) { - return Optional.absent(); + return Optional.empty(); } return Optional.of(this.interVpnLinkCfg.getSecondEndpoint().getVpnUuid().getValue()); } public Optional getSecondEndpointIpAddr() { if (!isComplete()) { - return Optional.absent(); + return Optional.empty(); } return Optional.of(this.interVpnLinkCfg.getSecondEndpoint().getIpAddress().getValue()); } public Optional 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 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 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 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 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 diff --git a/vpnmanager/impl/pom.xml b/vpnmanager/impl/pom.xml index b51661fef3..80e0481c43 100644 --- a/vpnmanager/impl/pom.xml +++ b/vpnmanager/impl/pom.xml @@ -22,9 +22,13 @@ and is available at http://www.eclipse.org/legal/epl-v10.html 4.0.0 - + + + org.opendaylight.mdsal + mdsal-binding-dom-adapter org.opendaylight.genius @@ -107,11 +111,17 @@ and is available at http://www.eclipse.org/legal/epl-v10.html - + + + org.opendaylight.mdsal + mdsal-binding-dom-adapter + test + test-jar diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/CentralizedSwitchChangeListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/CentralizedSwitchChangeListener.java index b3236a56e2..80da10c4b8 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/CentralizedSwitchChangeListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/CentralizedSwitchChangeListener.java @@ -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 { + extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(NaptSwitches.class).child(RouterToNaptSwitch.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override - protected void remove(InstanceIdentifier key, RouterToNaptSwitch routerToNaptSwitch) { + public void remove(InstanceIdentifier 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 key, RouterToNaptSwitch origRouterToNaptSwitch, + public void update(InstanceIdentifier 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 key, RouterToNaptSwitch routerToNaptSwitch) { + public void add(InstanceIdentifier 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 confTx, int addOrRemove) throws ExecutionException, InterruptedException { diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/DpnInVpnChangeListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/DpnInVpnChangeListener.java index 2bad35cb12..6b1d3fa13c 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/DpnInVpnChangeListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/DpnInVpnChangeListener.java @@ -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(); diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/FibEntriesListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/FibEntriesListener.java index 1164671f87..c358c89c3a 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/FibEntriesListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/FibEntriesListener.java @@ -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 { +public class FibEntriesListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, + public void remove(InstanceIdentifier 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 identifier, + public void update(InstanceIdentifier 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 identifier, + public void add(InstanceIdentifier identifier, VrfEntry add) { LOG.trace("Add Vrf Entry event - Key : {}, value : {}", identifier, add); final VrfTablesKey key = identifier.firstKeyOf(VrfTables.class); diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/InterfaceStateChangeListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/InterfaceStateChangeListener.java index 1c017946d6..9211bfcf86 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/InterfaceStateChangeListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/InterfaceStateChangeListener.java @@ -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 { +public class InterfaceStateChangeListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Interface intrf) { + public void add(InstanceIdentifier 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 identifier, Interface intrf) { + public void remove(InstanceIdentifier 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 identifier, + public void update(InstanceIdentifier identifier, Interface original, Interface update) { final String ifName = update.getName(); try { diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetOpDpnManager.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetOpDpnManager.java index 3ecad5b9f9..6196a8b8e5 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetOpDpnManager.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetOpDpnManager.java @@ -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; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRouteInterfaceStateChangeListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRouteInterfaceStateChangeListener.java index 472d5d12cb..db124d831a 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRouteInterfaceStateChangeListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRouteInterfaceStateChangeListener.java @@ -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 { +public class SubnetRouteInterfaceStateChangeListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Interface intrf) { + public void add(InstanceIdentifier 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 identifier, Interface intrf) { + public void remove(InstanceIdentifier identifier, Interface intrf) { if (L2vlan.class.equals(intrf.getType())) { LOG.trace("SubnetRouteInterfaceListener remove: Received interface {} down event", intrf); List 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 identifier, + public void update(InstanceIdentifier 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); } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRoutePacketInHandler.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRoutePacketInHandler.java index 1dd4aeac75..f30a102b5a 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRoutePacketInHandler.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRoutePacketInHandler.java @@ -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()); } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetmapChangeListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetmapChangeListener.java index 00a250dd62..e2d1c7e663 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetmapChangeListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetmapChangeListener.java @@ -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 { +public class SubnetmapChangeListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Subnetmap subnetmap) { + public void add(InstanceIdentifier 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 identifier, Subnetmap subnetmap) { + public void remove(InstanceIdentifier 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 identifier, Subnetmap subnetmapOriginal, Subnetmap + public void update(InstanceIdentifier identifier, Subnetmap subnetmapOriginal, Subnetmap subnetmapUpdate) { LOG.debug("update: method - key {}, original {}, update {}", identifier, subnetmapOriginal, subnetmapUpdate); @@ -241,11 +235,6 @@ public class SubnetmapChangeListener extends AsyncDataTreeChangeListenerBase 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(); diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelEndPointChangeListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelEndPointChangeListener.java index dbc0e934d3..6c21cc1cad 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelEndPointChangeListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelEndPointChangeListener.java @@ -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 { + extends AbstractAsyncDataTreeChangeListener { 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 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 key, TunnelEndPoints tep) { + public void remove(InstanceIdentifier key, TunnelEndPoints tep) { } @Override - protected void update(InstanceIdentifier key, TunnelEndPoints origTep, + public void update(InstanceIdentifier key, TunnelEndPoints origTep, TunnelEndPoints updatedTep) { } @Override - protected void add(InstanceIdentifier key, TunnelEndPoints tep) { + public void add(InstanceIdentifier 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; - } } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelInterfaceStateListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelInterfaceStateListener.java index 1a8e46fb6f..85d3dc0af9 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelInterfaceStateListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelInterfaceStateListener.java @@ -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 { +public class TunnelInterfaceStateListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, StateTunnelList del) { + public void remove(InstanceIdentifier 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 identifier, StateTunnelList original, + public void update(InstanceIdentifier 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 identifier, StateTunnelList add) { + public void add(InstanceIdentifier 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); } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnElanInterfaceChangeListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnElanInterfaceChangeListener.java index 784da0cc69..c4a04c34c8 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnElanInterfaceChangeListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnElanInterfaceChangeListener.java @@ -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 { +public class VpnElanInterfaceChangeListener extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(ElanInterfaces.class).child(ElanInterface.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } + @Override - protected void remove(InstanceIdentifier key, ElanInterface elanInterface) { + public void remove(InstanceIdentifier 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 key, ElanInterface origElanInterface, + public void update(InstanceIdentifier key, ElanInterface origElanInterface, ElanInterface updatedElanInterface) { } @Override - protected void add(InstanceIdentifier key, ElanInterface elanInterface) { + public void add(InstanceIdentifier 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; - } } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnFootprintService.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnFootprintService.java index 34e26c2007..756d0c1b7b 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnFootprintService.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnFootprintService.java @@ -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; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInstanceListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInstanceListener.java index 84ceaf7dce..229d5568e1 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInstanceListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInstanceListener.java @@ -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 { +public class VpnInstanceListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, VpnInstance del) { + public void remove(InstanceIdentifier identifier, VpnInstance del) { LOG.trace("{} : VPN event key: {}, value: {}", LOGGING_PREFIX_DELETE, identifier, del); final String vpnName = del.getVpnInstanceName(); Optional vpnOpValue; @@ -138,7 +138,7 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase identifier, + public void update(InstanceIdentifier 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 identifier, final VpnInstance value) { + public void add(final InstanceIdentifier 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>> { + private class AddVpnInstanceWorker implements Callable>> { private final Logger log = LoggerFactory.getLogger(AddVpnInstanceWorker.class); VpnInstance vpnInstance; DataBroker broker; @@ -366,15 +366,19 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase 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 { +public class VpnInterfaceManager extends AbstractAsyncDataTreeChangeListener { 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(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 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 adjacencies = Optional.absent(); + Optional 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 identifier = VpnUtil.getVpnInterfaceIdentifier(interfaceName); // Read NextHops - Optional vpnInteface = Optional.absent(); + Optional 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 gwMac = Optional.absent(); + Optional 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 identifier, final VpnInterface original, + public void update(final InstanceIdentifier 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 { +public class VpnInterfaceOpListener extends AbstractAsyncDataTreeChangeListener { 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 getWildCardPath() { - InstanceIdentifier 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 identifier, + public void remove(final InstanceIdentifier 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 identifier, + public void update(final InstanceIdentifier identifier, final VpnInterfaceOpDataEntry original, final VpnInterfaceOpDataEntry update) { LOG.info("update: interface {} vpn {}", original.getName(), original.getVpnInstanceName()); } @Override - protected void add(InstanceIdentifier identifier, VpnInterfaceOpDataEntry add) { + public void add(InstanceIdentifier identifier, VpnInterfaceOpDataEntry add) { LOG.info("add: interface {} vpn {}. Ignoring", add.getName(), add.getVpnInstanceName()); } } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnManagerImpl.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnManagerImpl.java index 4dfde8026d..150d62405c 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnManagerImpl.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnManagerImpl.java @@ -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); diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnNodeListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnNodeListener.java index 440dac2875..6ca92ed3e6 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnNodeListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnNodeListener.java @@ -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 { +public class VpnNodeListener extends AbstractAsyncDataTreeChangeListener { 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(); this.vpnConfig = vpnConfig; + start(); } - @PostConstruct public void start() { - registerListener(LogicalDatastoreType.OPERATIONAL, broker); + LOG.info("{} start", getClass().getSimpleName()); } @Override - protected InstanceIdentifier 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 identifier, Node add) { + public void add(InstanceIdentifier 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 identifier, Node del) { + public void remove(InstanceIdentifier identifier, Node del) { Uint64 dpId = MDSALUtil.getDpnIdFromNodeName(del.getId()); connectedDpnIds.remove(dpId); } @Override - protected void update(InstanceIdentifier identifier, Node original, Node update) { + public void update(InstanceIdentifier identifier, Node original, Node update) { } public boolean isConnectedNode(Uint64 nodeId) { diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java index bb8f13ef9a..502d2308a4 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java @@ -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 { +public class VpnOpStatusListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, VpnInstanceOpDataEntry value) { + public void remove(InstanceIdentifier identifier, VpnInstanceOpDataEntry value) { LOG.info("remove: Ignoring vpn Op {} with rd {}", value.getVpnInstanceName(), value.getVrfId()); } @Override @SuppressWarnings("checkstyle:IllegalCatch") - protected void update(InstanceIdentifier identifier, + public void update(InstanceIdentifier 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 vpnToExtraroute = VpnExtraRouteHelper.getVpnToExtrarouteVpnIdentifier(vpnName); - Optional optVpnToExtraroute = Optional.absent(); + Optional 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 optPrefixToIntf = Optional.absent(); + Optional 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 vpnNextHops = InstanceIdentifier.builder(L3nexthop.class).child( VpnNexthops.class, new VpnNexthopsKey(vpnId)).build(); - Optional optL3nexthopForVpnId = Optional.absent(); + Optional 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 identifier, + public void add(final InstanceIdentifier identifier, final VpnInstanceOpDataEntry value) { LOG.debug("add: Ignoring vpn Op {} with rd {}", value.getVpnInstanceName(), value.getVrfId()); } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnRpcServiceImpl.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnRpcServiceImpl.java index 0994ddb216..2488cbe2cb 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnRpcServiceImpl.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnRpcServiceImpl.java @@ -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; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnServiceElanDpnInterfacesListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnServiceElanDpnInterfacesListener.java index 7fb640f5ed..f17a7cd16c 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnServiceElanDpnInterfacesListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnServiceElanDpnInterfacesListener.java @@ -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 { +public class VpnServiceElanDpnInterfacesListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, DpnInterfaces dpnInterfaces) { + public void remove(InstanceIdentifier identifier, DpnInterfaces dpnInterfaces) { } @Override - protected void update(InstanceIdentifier identifier, DpnInterfaces original, + public void update(InstanceIdentifier 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 identifier, DpnInterfaces dpnInterfaces) { + public void add(InstanceIdentifier 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 getUpdatedInterfaceList(List updatedInterfaceList, List currentInterfaceList) { if (updatedInterfaceList == null) { diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java index 2b16bbd9ec..941610a12c 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java @@ -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 {}" diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java index 2c47b7e560..bc8eee60fc 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java @@ -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 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> getVpnHandlingIpv4AssociatedWithInterface(String interfaceName) { InstanceIdentifier interfaceId = getVpnInterfaceIdentifier(interfaceName); - Optional> vpnOptional = Optional.absent(); + Optional> vpnOptional = Optional.empty(); Optional optConfiguredVpnInterface = read(LogicalDatastoreType.CONFIGURATION, interfaceId); if (optConfiguredVpnInterface.isPresent()) { VpnInterface cfgVpnInterface = optConfiguredVpnInterface.get(); @@ -829,7 +828,7 @@ public final class VpnUtil { private Optional read(LogicalDatastoreType datastoreType, InstanceIdentifier 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 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 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 buildSubnetMapsWildCardPath() { @@ -1370,7 +1369,7 @@ public final class VpnUtil { } public Optional getGatewayIpAddressFromInterface(MacEntry macEntry) { - Optional gatewayIp = Optional.absent(); + Optional gatewayIp = Optional.empty(); String srcInterface = macEntry.getInterfaceName(); InetAddress hiddenIp = macEntry.getIpAddress(); if (neutronVpnService != null) { @@ -1398,7 +1397,7 @@ public final class VpnUtil { } public Optional getGWMacAddressFromInterface(MacEntry macEntry, IpAddress gatewayIp) { - Optional gatewayMac = Optional.absent(); + Optional gatewayMac = Optional.empty(); Uint32 vpnId = getVpnId(macEntry.getVpnName()); InstanceIdentifier @@ -1446,7 +1445,7 @@ public final class VpnUtil { } public Optional getVpnSubnetGatewayIp(final Uuid subnetUuid) { - Optional gwIpAddress = Optional.absent(); + Optional gwIpAddress = Optional.empty(); final SubnetKey subnetkey = new SubnetKey(subnetUuid); final InstanceIdentifier subnetidentifier = InstanceIdentifier.create(Neutron.class) .child(Subnets.class) @@ -1730,7 +1729,7 @@ public final class VpnUtil { InstanceIdentifier 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 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 elanInterfaceId = getElanInterfaceConfigurationDataPathId(elanInterfaceName); - return read(LogicalDatastoreType.CONFIGURATION, elanInterfaceId).orNull(); + return read(LogicalDatastoreType.CONFIGURATION, elanInterfaceId).orElse(null); } static InstanceIdentifier getElanInterfaceConfigurationDataPathId(String interfaceName) { @@ -2114,7 +2118,7 @@ public final class VpnUtil { DpnInterfaces getElanInterfaceInfoByElanDpn(String elanInstanceName, Uint64 dpId) { InstanceIdentifier 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 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; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/arp/responder/ArpResponderHandler.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/arp/responder/ArpResponderHandler.java index 81ecb31f03..283c37363e 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/arp/responder/ArpResponderHandler.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/arp/responder/ArpResponderHandler.java @@ -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; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/IVpnLinkServiceImpl.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/IVpnLinkServiceImpl.java index a412914ee1..4e981989be 100755 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/IVpnLinkServiceImpl.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/IVpnLinkServiceImpl.java @@ -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 buildRouterXL3VPNMap() { InstanceIdentifier vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build(); - Optional optVpnMaps = - MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vpnMapsIdentifier); + Optional 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 routersIid = InstanceIdentifier.builder(Neutron.class) .child(Routers.class).build(); - Optional routerOpData = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, routersIid); + Optional 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 routers = routerOpData.get().nonnullRouter(); diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkCacheFeeder.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkCacheFeeder.java index 808205caf6..dc18957e35 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkCacheFeeder.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkCacheFeeder.java @@ -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 { +public class InterVpnLinkCacheFeeder extends AbstractClusteredAsyncDataTreeChangeListener { 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 identifier, InterVpnLink del) { + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); + } + + @Override + public void remove(InstanceIdentifier identifier, InterVpnLink del) { interVpnLinkCache.removeInterVpnLinkFromCache(del); } @Override - protected void update(InstanceIdentifier identifier, InterVpnLink original, InterVpnLink update) { + public void update(InstanceIdentifier identifier, InterVpnLink original, InterVpnLink update) { // TODO Auto-generated method stub } @Override - protected void add(InstanceIdentifier identifier, InterVpnLink add) { + public void add(InstanceIdentifier 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 getWildCardPath() { - return InstanceIdentifier.create(InterVpnLinks.class).child(InterVpnLink.class); - } - - @Override - protected InterVpnLinkCacheFeeder getDataTreeChangeListener() { - return this; - } - } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkCacheImpl.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkCacheImpl.java index c0a14260b2..4d75774863 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkCacheImpl.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkCacheImpl.java @@ -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 interVpnLinksIid = InstanceIdentifier.builder(InterVpnLinks.class).build(); - - Optional 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 interVpnLinkStateIid = - InstanceIdentifier.builder(InterVpnLinkStates.class).build(); - - Optional optIVpnLinkStateOpData = - MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, interVpnLinkStateIid); - if (!optIVpnLinkStateOpData.isPresent()) { - return; - } - InterVpnLinkStates interVpnLinkStates = optIVpnLinkStateOpData.get(); - for (InterVpnLinkState interVpnLinkState : interVpnLinkStates.nonnullInterVpnLinkState()) { - addInterVpnLinkStateToCaches(interVpnLinkState); + try { + Optional 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 interVpnLinkStateIid = + InstanceIdentifier.builder(InterVpnLinkStates.class).build(); + + Optional 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 getInterVpnLinkByName(String interVpnLinkName) { - return Optional.fromNullable(safeGet(nameToInterVpnLinkCache, interVpnLinkName)); + return Optional.ofNullable(safeGet(nameToInterVpnLinkCache, interVpnLinkName)); } @Override public Optional 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 getInterVpnLinkByVpnId(String vpnId) { - return Optional.fromNullable(safeGet(uuidToInterVpnLinkCache, vpnId)); + return Optional.ofNullable(safeGet(uuidToInterVpnLinkCache, vpnId)); } @Override diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkListener.java index 114cff1ca3..7fa501a287 100755 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkListener.java @@ -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 { +public class InterVpnLinkListener extends AbstractAsyncDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkListener.class); @@ -114,6 +115,9 @@ public class InterVpnLinkListener extends AsyncDataTreeChangeListenerBase 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 identifier, InterVpnLink add) { + public void add(InstanceIdentifier 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 identifier, InterVpnLink del) { + public void remove(InstanceIdentifier identifier, InterVpnLink del) { LOG.debug("Reacting to InterVpnLink {} removal", del.getName()); @@ -419,7 +418,7 @@ public class InterVpnLinkListener extends AsyncDataTreeChangeListenerBase identifier, InterVpnLink original, InterVpnLink update) { + public void update(InstanceIdentifier identifier, InterVpnLink original, InterVpnLink update) { LOG.debug("Update InterVpnLink {}. " + " original=[1stEndpoint=[vpn=<{}> ipAddr=<{}>] 2ndEndpoint=[vpn=<{}> ipAddr=<{}>]]" diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkLocator.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkLocator.java index 190fb2150a..1296ffa2a4 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkLocator.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkLocator.java @@ -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 selectSuitableDpns(InterVpnLink interVpnLink) { int numberOfDpns = Integer.getInteger(NBR_OF_DPNS_PROPERTY_NAME, 1); - List dpnIdPool = NWUtil.getOperativeDPNs(dataBroker).stream() - .map(dpn -> dpn) - .collect(Collectors.toList()); + List 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; } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkNodeAddTask.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkNodeAddTask.java index 47c9d4269b..bd555d9346 100755 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkNodeAddTask.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkNodeAddTask.java @@ -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>> { +public class InterVpnLinkNodeAddTask implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkNodeAddTask.class); private static final String NBR_OF_DPNS_PROPERTY_NAME = "vpnservice.intervpnlink.number.dpns"; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkNodeListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkNodeListener.java index e7c68e724f..907ea6232b 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkNodeListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkNodeListener.java @@ -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 { +public class InterVpnLinkNodeListener extends AbstractAsyncDataTreeChangeListener { 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 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 identifier, Node add) { + public void add(InstanceIdentifier 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 identifier, Node del) { + public void remove(InstanceIdentifier 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 identifier, Node original, Node update) { + public void update(InstanceIdentifier identifier, Node original, Node update) { } } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkStateCacheFeeder.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkStateCacheFeeder.java index 9b65983f90..7f2a494520 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkStateCacheFeeder.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkStateCacheFeeder.java @@ -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 { +public class InterVpnLinkStateCacheFeeder extends AbstractClusteredAsyncDataTreeChangeListener { 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 identifier, InterVpnLinkState del) { + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); + } + + @Override + public void remove(InstanceIdentifier identifier, InterVpnLinkState del) { LOG.debug("InterVpnLinkState {} has been removed", del.getInterVpnLinkName()); interVpnLinkCache.removeInterVpnLinkStateFromCache(del); } @Override - protected void update(InstanceIdentifier identifier, InterVpnLinkState original, + public void update(InstanceIdentifier identifier, InterVpnLinkState original, InterVpnLinkState update) { LOG.debug("InterVpnLinkState {} has been updated", update.getInterVpnLinkName()); interVpnLinkCache.addInterVpnLinkStateToCaches(update); } @Override - protected void add(InstanceIdentifier identifier, InterVpnLinkState add) { + public void add(InstanceIdentifier identifier, InterVpnLinkState add) { LOG.debug("InterVpnLinkState {} has been added", add.getInterVpnLinkName()); interVpnLinkCache.addInterVpnLinkStateToCaches(add); } - @Override - protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(InterVpnLinkStates.class).child(InterVpnLinkState.class); - } - - @Override - protected InterVpnLinkStateCacheFeeder getDataTreeChangeListener() { - return this; - } - } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkStateListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkStateListener.java index 759bc8f38f..dfac97b24b 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkStateListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkStateListener.java @@ -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 { +public class InterVpnLinkStateListener extends AbstractAsyncDataTreeChangeListener { 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 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 key, InterVpnLinkState dataObjectModification) { + public void remove(InstanceIdentifier key, InterVpnLinkState dataObjectModification) { } @Override - protected void update(InstanceIdentifier key, InterVpnLinkState before, + public void update(InstanceIdentifier key, InterVpnLinkState before, InterVpnLinkState after) { if (before.getState() == InterVpnLinkState.State.Error && after.getState() == InterVpnLinkState.State.Active) { Optional optIVpnLink = @@ -84,6 +81,6 @@ public class InterVpnLinkStateListener @Override - protected void add(InstanceIdentifier key, InterVpnLinkState dataObjectModification) { + public void add(InstanceIdentifier key, InterVpnLinkState dataObjectModification) { } } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkUtil.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkUtil.java index fc33980287..61e7cd4f9d 100755 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkUtil.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkUtil.java @@ -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 getInterVpnLinkState(String interVpnLinkName) { - Optional interVpnLinkStateOptional = Optional.absent(); + Optional 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; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkCleanedCheckerTask.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkCleanedCheckerTask.java index 3d639dd407..8bba2d547d 100755 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkCleanedCheckerTask.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkCleanedCheckerTask.java @@ -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>> { +public class InterVpnLinkCleanedCheckerTask implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkCleanedCheckerTask.class); private static final long MAX_WAIT_FOR_REMOVAL = 10000; // 10 seconds diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkCreatorTask.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkCreatorTask.java index 2a4e67175b..692da5de01 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkCreatorTask.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkCreatorTask.java @@ -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>> { +public class InterVpnLinkCreatorTask implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkCreatorTask.class); diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkRemoverTask.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkRemoverTask.java index e403452782..94cf21a8bf 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkRemoverTask.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkRemoverTask.java @@ -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>> { +public class InterVpnLinkRemoverTask implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkRemoverTask.class); private final InstanceIdentifier interVpnLinkIid; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/AbstractIpLearnNotificationHandler.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/AbstractIpLearnNotificationHandler.java index 1d60921e78..f99916407a 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/AbstractIpLearnNotificationHandler.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/AbstractIpLearnNotificationHandler.java @@ -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; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/AlivenessMonitorUtils.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/AlivenessMonitorUtils.java index e084f657c7..e4b2985a2c 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/AlivenessMonitorUtils.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/AlivenessMonitorUtils.java @@ -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 allocateIpMonitorProfile(IpAddress targetIp) { - Optional profileIdOptional = Optional.absent(); + Optional 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 getMonitorIdFromInterface(MacEntry macEntry) { String interfaceName = macEntry.getInterfaceName(); java.util.Optional monitorId = java.util.Optional.empty(); - Optional interfaceMonitorEntryOptional = MDSALUtil.read(dataBroker, - LogicalDatastoreType.OPERATIONAL, getInterfaceMonitorMapId(interfaceName)); + Optional 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)); } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorEventListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorEventListener.java index 0769bdd7f9..b041d31f5d 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorEventListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorEventListener.java @@ -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; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorStartTask.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorStartTask.java index e60d1a98a3..a1273ce70a 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorStartTask.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorStartTask.java @@ -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>> { +public class IpMonitorStartTask implements Callable>> { private final MacEntry macEntry; private final Long arpMonitorProfileId; private final AlivenessMonitorUtils alivenessMonitorUtils; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorStopTask.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorStopTask.java index 10f8ac882f..023bc0dd41 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorStopTask.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorStopTask.java @@ -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>> { +public class IpMonitorStopTask implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(IpMonitorStopTask.class); private MacEntry macEntry; private DataBroker dataBroker; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitoringHandler.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitoringHandler.java index 5251528894..afd80169b7 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitoringHandler.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitoringHandler.java @@ -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 { +public class IpMonitoringHandler extends AbstractClusteredAsyncDataTreeChangeListener { 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 arpMonitorProfileId = Optional.absent(); - private Optional ipv6NdMonitorProfileId = Optional.absent(); + private Optional arpMonitorProfileId = Optional.empty(); + private Optional 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 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 id, LearntVpnVipToPort value, + public void update(InstanceIdentifier id, LearntVpnVipToPort value, LearntVpnVipToPort dataObjectModificationAfter) { runOnlyInOwnerNode("IpMonitoringHandler: update event", () -> { try { @@ -131,7 +123,7 @@ public class IpMonitoringHandler } @Override - protected void add(InstanceIdentifier identifier, LearntVpnVipToPort value) { + public void add(InstanceIdentifier 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 key, LearntVpnVipToPort value) { + public void remove(InstanceIdentifier key, LearntVpnVipToPort value) { runOnlyInOwnerNode("IpMonitoringHandler: remove event", () -> { try { InetAddress srcInetAddr = InetAddress.getByName(value.getPortFixedip()); diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/LearntVpnVipToPortEventProcessor.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/LearntVpnVipToPortEventProcessor.java index fa559057a2..18a7b56e98 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/LearntVpnVipToPortEventProcessor.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/LearntVpnVipToPortEventProcessor.java @@ -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 { + extends AbstractClusteredAsyncDataTreeChangeListener { 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 getWildCardPath() { - return InstanceIdentifier.create(LearntVpnVipToPortEventData.class).child(LearntVpnVipToPortEvent.class); - } - - @Override - protected LearntVpnVipToPortEventProcessor getDataTreeChangeListener() { - return this; - } - - @Override - protected void update(InstanceIdentifier id, LearntVpnVipToPortEvent value, + public void update(InstanceIdentifier 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 identifier, LearntVpnVipToPortEvent value) { + public void add(InstanceIdentifier 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 key, LearntVpnVipToPortEvent value) { + public void remove(InstanceIdentifier key, LearntVpnVipToPortEvent value) { // Removals are triggered by add handling. // NOTE: DONOT ADD ANY CODE HERE AND MAKE A CIRCUS } - private class AddMipAdjacencyWorker implements Callable>> { + private class AddMipAdjacencyWorker implements Callable>> { 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>> { + private class DeleteMipAdjacencyWorker implements Callable>> { String vpnName; String interfaceName; String ipAddress; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnOverMplsGrePopulator.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnOverMplsGrePopulator.java index c15f7a56f8..3ea3838ee5 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnOverMplsGrePopulator.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnOverMplsGrePopulator.java @@ -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; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnOverVxlanPopulator.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnOverVxlanPopulator.java index ebd9878829..53b0011e18 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnOverVxlanPopulator.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnOverVxlanPopulator.java @@ -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; diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnPopulator.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnPopulator.java index 27b41eb97a..d7c899eae7 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnPopulator.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnPopulator.java @@ -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 entry = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId); - + Optional 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 vrfEntryList = Collections.singletonList(vrfEntry); diff --git a/vpnmanager/impl/src/main/resources/OSGI-INF/blueprint/vpnmanager.xml b/vpnmanager/impl/src/main/resources/OSGI-INF/blueprint/vpnmanager.xml index bda4ffa0e0..59f6e1f742 100644 --- a/vpnmanager/impl/src/main/resources/OSGI-INF/blueprint/vpnmanager.xml +++ b/vpnmanager/impl/src/main/resources/OSGI-INF/blueprint/vpnmanager.xml @@ -4,14 +4,14 @@ odl:use-default-for-reference-types="true"> + interface="org.opendaylight.mdsal.binding.api.NotificationPublishService" /> 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 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(); } - } diff --git a/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkTestCatalog.java b/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkTestCatalog.java index 394e51df30..ff0dac7a0c 100644 --- a/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkTestCatalog.java +++ b/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkTestCatalog.java @@ -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 newDpns) { Optional new1stEpState = (is1stEndpoint) ? Optional.of(InterVpnLinkUtil.buildFirstEndpointState(ivl.getInterVpnLinkState().getFirstEndpointState(), - Optional.of(newDpns), Optional.absent())) - : Optional.absent(); + Optional.of(newDpns), Optional.empty())) + : Optional.empty(); Optional 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 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 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(); } } diff --git a/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/SubnetOpDpnManagerTest.java b/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/SubnetOpDpnManagerTest.java index 1c516a15a6..a41a058439 100644 --- a/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/SubnetOpDpnManagerTest.java +++ b/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/SubnetOpDpnManagerTest.java @@ -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); diff --git a/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnServiceTest.java b/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnServiceTest.java index 0eaeef9c36..ab26652bbf 100644 --- a/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnServiceTest.java +++ b/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnServiceTest.java @@ -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; diff --git a/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnSubnetRouteHandlerTest.java b/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnSubnetRouteHandlerTest.java index 1a9cfeed21..e6c6e08c4e 100644 --- a/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnSubnetRouteHandlerTest.java +++ b/vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnSubnetRouteHandlerTest.java @@ -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); diff --git a/vpnmanager/shell/src/main/java/org/opendaylight/netvirt/vpnmanager/shell/ShowVpn.java b/vpnmanager/shell/src/main/java/org/opendaylight/netvirt/vpnmanager/shell/ShowVpn.java index f8dc27ca0b..8ea5ecea34 100644 --- a/vpnmanager/shell/src/main/java/org/opendaylight/netvirt/vpnmanager/shell/ShowVpn.java +++ b/vpnmanager/shell/src/main/java/org/opendaylight/netvirt/vpnmanager/shell/ShowVpn.java @@ -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 Optional read(LogicalDatastoreType datastoreType, InstanceIdentifier 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); diff --git a/vpnmanager/shell/src/main/java/org/opendaylight/netvirt/vpnmanager/shell/ShowVpnInstanceOpData.java b/vpnmanager/shell/src/main/java/org/opendaylight/netvirt/vpnmanager/shell/ShowVpnInstanceOpData.java index f95908c9c1..bc19af3349 100644 --- a/vpnmanager/shell/src/main/java/org/opendaylight/netvirt/vpnmanager/shell/ShowVpnInstanceOpData.java +++ b/vpnmanager/shell/src/main/java/org/opendaylight/netvirt/vpnmanager/shell/ShowVpnInstanceOpData.java @@ -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 Optional read(LogicalDatastoreType datastoreType, InstanceIdentifier 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); diff --git a/vpnmanager/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/vpnmanager/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml index c390981dc1..7d00f712ee 100644 --- a/vpnmanager/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml +++ b/vpnmanager/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -9,7 +9,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html - -- 2.36.6