2 * Copyright (c) 2019 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.netvirt.natservice.internal;
10 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
12 import com.google.common.util.concurrent.ListenableFuture;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.Optional;
16 import javax.inject.Inject;
17 import javax.inject.Singleton;
18 import org.opendaylight.genius.cloudscaler.api.TombstonedNodeManager;
19 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
20 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
21 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
22 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
23 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
24 import org.opendaylight.mdsal.binding.api.DataBroker;
25 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
26 import org.opendaylight.netvirt.elanmanager.api.IElanService;
27 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
28 import org.opendaylight.serviceutils.upgrade.UpgradeState;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.dpn.routers.DpnRoutersList;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.dpn.routers.dpn.routers.list.RoutersList;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ProviderTypes;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
35 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
36 import org.opendaylight.yangtools.yang.common.Uint32;
37 import org.opendaylight.yangtools.yang.common.Uint64;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
42 public class NatScalein {
44 private static final Logger LOG = LoggerFactory.getLogger(NatScalein.class);
45 private final DataBroker dataBroker;
46 private final IMdsalApiManager mdsalManager;
47 private final IdManagerService idManager;
48 private final JobCoordinator jobCoordinator;
49 private NaptSwitchHA naptSwitchHA;
50 private final IElanService elanManager;
51 private final INeutronVpnManager nvpnManager;
52 private final TombstonedNodeManager tombstonedNodeManager;
53 private final ManagedNewTransactionRunner txRunner;
54 private final UpgradeState upgradeState;
57 public NatScalein(final DataBroker dataBroker, final IMdsalApiManager mdsalManager,
58 final IdManagerService idManager, final JobCoordinator jobCoordinator,
59 final NaptSwitchHA naptSwitchHA,
60 final IElanService elanManager,
61 final INeutronVpnManager nvpnManager,
62 final TombstonedNodeManager tombstonedNodeManager,
63 final UpgradeState upgradeState) {
64 this.dataBroker = dataBroker;
65 this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
66 this.mdsalManager = mdsalManager;
67 this.idManager = idManager;
68 this.naptSwitchHA = naptSwitchHA;
69 this.jobCoordinator = jobCoordinator;
70 this.tombstonedNodeManager = tombstonedNodeManager;
71 this.elanManager = elanManager;
72 this.nvpnManager = nvpnManager;
73 this.upgradeState = upgradeState;
74 tombstonedNodeManager.addOnRecoveryCallback((dpnId) -> {
75 jobCoordinator.enqueueJob(dpnId.toString(), () -> {
83 protected void remove(Uint64 srcDpnId) {
84 LOG.debug("Called Remove on addOnRecoveryCallback");
85 InstanceIdentifier<DpnRoutersList> dpnRoutersListIdentifier = NatUtil
86 .getDpnRoutersId(srcDpnId);
87 Optional<DpnRoutersList> optionalDpnRoutersList =
88 SingleTransactionDataBroker
89 .syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
90 LogicalDatastoreType.OPERATIONAL, dpnRoutersListIdentifier);
91 if (optionalDpnRoutersList.isPresent()) {
92 List<RoutersList> routersListFromDs = new ArrayList<RoutersList>(optionalDpnRoutersList.get()
93 .getRoutersList().values());
94 routersListFromDs.forEach(router -> {
95 String routerName = router.getRouter();
96 Routers extRouters = NatUtil.getRoutersFromConfigDS(dataBroker, routerName);
97 if (extRouters != null && extRouters.isEnableSnat()) {
98 jobCoordinator.enqueueJob((NatConstants.NAT_DJC_PREFIX + routerName), () -> {
99 List<ListenableFuture<Void>> futures = new ArrayList<>();
100 Uint64 naptId = NatUtil
101 .getPrimaryNaptfromRouterName(dataBroker, routerName);
102 if (naptId == null || naptId.equals(Uint64.ZERO)) {
103 Uint32 routerId = NatUtil.getVpnId(dataBroker, routerName);
104 Uint32 routerVpnId = getBgpVpnIdForRouter(routerId, routerName);
106 if (routerVpnId != NatConstants.INVALID_ID) {
107 ProviderTypes extNwProvType = NatEvpnUtil
108 .getExtNwProvTypeFromRouterName(dataBroker,
109 routerName, extRouters.getNetworkId());
110 txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION,
113 .handleSNATForDPN(dataBroker, mdsalManager, idManager,
115 srcDpnId, extRouters, routerId, routerVpnId, confTx,
116 extNwProvType, upgradeState);
121 }, NatConstants.NAT_DJC_MAX_RETRIES);
127 private Uint32 getBgpVpnIdForRouter(Uint32 routerId, String routerName) {
129 if (routerId == NatConstants.INVALID_ID) {
131 "NAT Service : SNAT -> Invalid ROUTER-ID {} returned for routerName {}",
132 routerId, routerName);
133 return NatConstants.INVALID_ID;
135 Uuid bgpVpnUuid = NatUtil.getVpnForRouter(dataBroker, routerName);
137 if (bgpVpnUuid == null) {
139 "NAT Service : SNAT -> Internal VPN-ID {} associated to router {}",
140 routerId, routerName);
143 bgpVpnId = NatUtil.getVpnId(dataBroker, bgpVpnUuid.getValue());
144 if (bgpVpnId == NatConstants.INVALID_ID) {
146 "NAT Service : SNAT -> Invalid Private BGP VPN ID returned for routerName {}",
148 return NatConstants.INVALID_ID;