*/
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 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.math.BigInteger;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
-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.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.AsyncDataTreeChangeListenerBase;
import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.genius.infra.Datastore.Configuration;
+import org.opendaylight.genius.infra.Datastore.Operational;
+import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
+import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.genius.infra.TypedWriteTransaction;
import org.opendaylight.genius.mdsalutil.FlowEntity;
import org.opendaylight.genius.mdsalutil.InstructionInfo;
import org.opendaylight.genius.mdsalutil.MDSALUtil;
import org.opendaylight.genius.mdsalutil.instructions.InstructionWriteMetadata;
import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
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.ListenableFutures;
import org.opendaylight.netvirt.fibmanager.api.IFibManager;
import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnAfConfig;
import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.vpntargets.VpnTargetBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.vpntargets.VpnTargetKey;
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;
public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInstance, VpnInstanceListener> {
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:";
private static final String LOGGING_PREFIX_DELETE = "VPN-REMOVE:";
private final DataBroker dataBroker;
+ private final ManagedNewTransactionRunner txRunner;
private final IdManagerService idManager;
private final VpnInterfaceManager vpnInterfaceManager;
private final IFibManager fibManager;
private final VpnOpDataSyncer vpnOpDataNotifier;
private final IMdsalApiManager mdsalManager;
private final JobCoordinator jobCoordinator;
+ private final VpnUtil vpnUtil;
@Inject
public VpnInstanceListener(final DataBroker dataBroker, final IdManagerService idManager,
final VpnInterfaceManager vpnInterfaceManager, final IFibManager fibManager,
final VpnOpDataSyncer vpnOpDataSyncer, final IMdsalApiManager mdsalManager,
- final JobCoordinator jobCoordinator) {
+ final JobCoordinator jobCoordinator, VpnUtil vpnUtil) {
super(VpnInstance.class, VpnInstanceListener.class);
this.dataBroker = dataBroker;
+ this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
this.idManager = idManager;
this.vpnInterfaceManager = vpnInterfaceManager;
this.fibManager = fibManager;
this.vpnOpDataNotifier = vpnOpDataSyncer;
this.mdsalManager = mdsalManager;
this.jobCoordinator = jobCoordinator;
+ this.vpnUtil = vpnUtil;
}
@PostConstruct
@Override
protected void remove(InstanceIdentifier<VpnInstance> identifier, VpnInstance del) {
- LOG.trace("{} remove: VPN event key: {}, value: {}", LOGGING_PREFIX_DELETE, identifier, del);
+ LOG.trace("{} : VPN event key: {}, value: {}", LOGGING_PREFIX_DELETE, identifier, del);
final String vpnName = del.getVpnInstanceName();
Optional<VpnInstanceOpDataEntry> vpnOpValue;
- String primaryRd = VpnUtil.getPrimaryRd(del);
+ String primaryRd = vpnUtil.getVpnRd(vpnName);
+ if (primaryRd == null) {
+ LOG.error("{}, failed to remove VPN: primaryRd is null for vpn {}", LOGGING_PREFIX_DELETE, vpnName);
+ return;
+ }
//TODO(vpnteam): Entire code would need refactoring to listen only on the parent object - VPNInstance
try {
vpnOpValue = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
VpnUtil.getVpnInstanceOpDataIdentifier(primaryRd));
} catch (ReadFailedException e) {
- LOG.error("{} remove: Exception when attempting to retrieve VpnInstanceOpDataEntry for VPN {}. ",
+ LOG.error("{}, failed to remove VPN: Exception while retrieving VpnInstanceOpDataEntry for VPN {}. ",
LOGGING_PREFIX_DELETE, vpnName, e);
return;
}
if (!vpnOpValue.isPresent()) {
- LOG.error("{} remove: Unable to retrieve VpnInstanceOpDataEntry for VPN {}. ", LOGGING_PREFIX_DELETE,
- vpnName);
+ LOG.error("{}, failed to remove VPN: Unable to retrieve VpnInstanceOpDataEntry for VPN {}. ",
+ LOGGING_PREFIX_DELETE, vpnName);
return;
} else {
- jobCoordinator.enqueueJob("VPN-" + vpnName, () -> {
- VpnInstanceOpDataEntryBuilder builder = new VpnInstanceOpDataEntryBuilder().setVrfId(primaryRd)
- .setVpnState(VpnInstanceOpDataEntry.VpnState.PendingDelete);
- InstanceIdentifier<VpnInstanceOpDataEntry> id = VpnUtil.getVpnInstanceOpDataIdentifier(primaryRd);
- WriteTransaction writeTxn = dataBroker.newWriteOnlyTransaction();
- writeTxn.merge(LogicalDatastoreType.OPERATIONAL, id, builder.build());
-
- LOG.info("{} call: Operational status set to PENDING_DELETE for vpn {} with rd {}",
- LOGGING_PREFIX_DELETE, vpnName, primaryRd);
- return Collections.singletonList(writeTxn.submit());
- }, SystemPropertyReader.getDataStoreJobCoordinatorMaxRetries());
+ jobCoordinator.enqueueJob("VPN-" + vpnName, () ->
+ Collections.singletonList(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL, tx -> {
+ VpnInstanceOpDataEntryBuilder builder = new VpnInstanceOpDataEntryBuilder().setVrfId(primaryRd)
+ .setVpnState(VpnInstanceOpDataEntry.VpnState.PendingDelete);
+ InstanceIdentifier<VpnInstanceOpDataEntry> id =
+ VpnUtil.getVpnInstanceOpDataIdentifier(primaryRd);
+ tx.merge(id, builder.build());
+
+ LOG.info("{} call: Operational status set to PENDING_DELETE for vpn {} with rd {}",
+ LOGGING_PREFIX_DELETE, vpnName, primaryRd);
+ })), SystemPropertyReader.getDataStoreJobCoordinatorMaxRetries());
}
}
@Override
protected void update(InstanceIdentifier<VpnInstance> identifier,
VpnInstance original, VpnInstance update) {
- LOG.trace("VPN-UPDATE: update: VPN event key: {}, value: {}. Ignoring", identifier, update);
+ LOG.trace("VPN-UPDATE: update: VPN event key: {}, value: {}.", identifier, update);
String vpnName = update.getVpnInstanceName();
+ if (original.getIpv4Family() != null && update.getIpv4Family() != null
+ && original.getIpv4Family().getRouteDistinguisher() != null
+ && update.getIpv4Family().getRouteDistinguisher() != null
+ && original.getIpv4Family().getRouteDistinguisher().size()
+ != update.getIpv4Family().getRouteDistinguisher().size()) {
+ LOG.debug("VPN-UPDATE: VpnInstance:{} updated with new RDs: {} from old RDs: {}", vpnName,
+ update.getIpv4Family().getRouteDistinguisher(), original.getIpv4Family().getRouteDistinguisher());
+ vpnUtil.updateVpnInstanceWithRdList(vpnName, update.getIpv4Family().getRouteDistinguisher());
+ }
vpnInterfaceManager.updateVpnInterfacesForUnProcessAdjancencies(vpnName);
}
protected void add(final InstanceIdentifier<VpnInstance> identifier, final VpnInstance value) {
LOG.trace("{} add: Add VPN event key: {}, value: {}", LOGGING_PREFIX_ADD, identifier, value);
final String vpnName = value.getVpnInstanceName();
- jobCoordinator.enqueueJob("VPN-" + vpnName, new AddVpnInstanceWorker(idManager, dataBroker, value),
+ jobCoordinator.enqueueJob("VPN-" + vpnName, new AddVpnInstanceWorker(dataBroker, value),
SystemPropertyReader.getDataStoreJobCoordinatorMaxRetries());
}
private class AddVpnInstanceWorker implements Callable<List<ListenableFuture<Void>>> {
private final Logger log = LoggerFactory.getLogger(AddVpnInstanceWorker.class);
- IdManagerService idManager;
VpnInstance vpnInstance;
DataBroker broker;
- AddVpnInstanceWorker(IdManagerService idManager,
- DataBroker broker,
- VpnInstance value) {
- this.idManager = idManager;
+ AddVpnInstanceWorker(DataBroker broker,
+ VpnInstance value) {
this.broker = broker;
this.vpnInstance = value;
}
@Override
- public List<ListenableFuture<Void>> call() throws Exception {
+ public List<ListenableFuture<Void>> call() {
// If another renderer(for eg : CSS) needs to be supported, check can be performed here
// to call the respective helpers.
- WriteTransaction writeConfigTxn = broker.newWriteOnlyTransaction();
- WriteTransaction writeOperTxn = broker.newWriteOnlyTransaction();
- addVpnInstance(vpnInstance, writeConfigTxn, writeOperTxn);
- try {
- writeOperTxn.submit().get();
- } catch (InterruptedException | ExecutionException e) {
- log.error("{} call: Error creating vpn {} ", LOGGING_PREFIX_ADD, vpnInstance.getVpnInstanceName());
- throw new RuntimeException(e.getMessage(), e);
- }
- List<ListenableFuture<Void>> futures = new ArrayList<>();
- futures.add(writeConfigTxn.submit());
- ListenableFuture<List<Void>> listenableFuture = Futures.allAsList(futures);
- Futures.addCallback(listenableFuture,
+ List<ListenableFuture<Void>> futures = new ArrayList<>(2);
+ futures.add(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, confTx -> {
+ ListenableFuture<Void> future = txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL, operTx ->
+ addVpnInstance(vpnInstance, confTx, operTx));
+ ListenableFutures.addErrorLogging(future, LOG, "{} call: error creating VPN {}", LOGGING_PREFIX_ADD,
+ vpnInstance.getVpnInstanceName());
+ futures.add(future);
+ }));
+ Futures.addCallback(Futures.allAsList(futures),
new PostAddVpnInstanceWorker(vpnInstance , vpnInstance.getVpnInstanceName()),
MoreExecutors.directExecutor());
return futures;
// TODO Clean up the exception handling
@SuppressWarnings("checkstyle:IllegalCatch")
- private void addVpnInstance(VpnInstance value, WriteTransaction writeConfigTxn,
- WriteTransaction writeOperTxn) {
+ private void addVpnInstance(VpnInstance value, TypedWriteTransaction<Configuration> writeConfigTxn,
+ TypedWriteTransaction<Operational> writeOperTxn) {
+ if (writeConfigTxn == null) {
+ ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx ->
+ addVpnInstance(value, tx, writeOperTxn)), LOG, "Error adding VPN instance {}", value);
+ return;
+ }
+ if (writeOperTxn == null) {
+ ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL, tx ->
+ addVpnInstance(value, writeConfigTxn, tx)), LOG, "Error adding VPN instance {}", value);
+ return;
+ }
VpnAfConfig config = value.getIpv4Family();
String vpnInstanceName = value.getVpnInstanceName();
- long vpnId = VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME, vpnInstanceName);
- if (vpnId == 0) {
+ Uint32 vpnId = vpnUtil.getUniqueId(VpnConstants.VPN_IDPOOL_NAME, vpnInstanceName);
+ if (vpnId.longValue() == 0) {
LOG.error("{} addVpnInstance: Unable to fetch label from Id Manager. Bailing out of adding operational"
+ " data for Vpn Instance {}", LOGGING_PREFIX_ADD, value.getVpnInstanceName());
return;
org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id.VpnInstance
vpnInstanceToVpnId = VpnUtil.getVpnInstanceToVpnId(vpnInstanceName, vpnId, primaryRd);
- if (writeConfigTxn != null) {
- writeConfigTxn.put(LogicalDatastoreType.CONFIGURATION,
- VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpnInstanceName),
- vpnInstanceToVpnId, WriteTransaction.CREATE_MISSING_PARENTS);
- } else {
- TransactionUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
- VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpnInstanceName),
- vpnInstanceToVpnId, TransactionUtil.DEFAULT_CALLBACK);
- }
+ writeConfigTxn.put(VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpnInstanceName),
+ vpnInstanceToVpnId, CREATE_MISSING_PARENTS);
VpnIds vpnIdToVpnInstance = VpnUtil.getVpnIdToVpnInstance(vpnId, value.getVpnInstanceName(),
primaryRd, VpnUtil.isBgpVpn(vpnInstanceName, primaryRd));
- if (writeConfigTxn != null) {
- writeConfigTxn.put(LogicalDatastoreType.CONFIGURATION,
- VpnUtil.getVpnIdToVpnInstanceIdentifier(vpnId),
- vpnIdToVpnInstance, WriteTransaction.CREATE_MISSING_PARENTS);
- } else {
- TransactionUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
- VpnUtil.getVpnIdToVpnInstanceIdentifier(vpnId),
- vpnIdToVpnInstance, TransactionUtil.DEFAULT_CALLBACK);
- }
+ writeConfigTxn.put(VpnUtil.getVpnIdToVpnInstanceIdentifier(vpnId), vpnIdToVpnInstance, CREATE_MISSING_PARENTS);
try {
String cachedTransType = fibManager.getConfTransType();
VpnInstanceOpDataEntryBuilder builder =
new VpnInstanceOpDataEntryBuilder().setVrfId(primaryRd).setVpnId(vpnId)
.setVpnInstanceName(vpnInstanceName)
- .setVpnState(VpnInstanceOpDataEntry.VpnState.Created)
- .setIpv4Configured(false).setIpv6Configured(false);
+ .setVpnState(VpnInstanceOpDataEntry.VpnState.Created);
if (VpnUtil.isBgpVpn(vpnInstanceName, primaryRd)) {
List<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn
.instance.op.data.entry.vpntargets.VpnTarget> opVpnTargetList = new ArrayList<>();
if (vpnTargetList != null) {
for (VpnTarget vpnTarget : vpnTargetList) {
VpnTargetBuilder vpnTargetBuilder =
- new VpnTargetBuilder().setKey(new VpnTargetKey(vpnTarget.getKey().getVrfRTValue()))
+ new VpnTargetBuilder().withKey(new VpnTargetKey(vpnTarget.key().getVrfRTValue()))
.setVrfRTType(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn
.instance.op.data.vpn.instance.op.data.entry.vpntargets.VpnTarget.VrfRTType
.forValue(vpnTarget.getVrfRTType().getIntValue())).setVrfRTValue(
} else {
builder.setBgpvpnType(VpnInstanceOpDataEntry.BgpvpnType.VPN);
}
- if (writeOperTxn != null) {
- writeOperTxn.merge(LogicalDatastoreType.OPERATIONAL,
- VpnUtil.getVpnInstanceOpDataIdentifier(primaryRd),
- builder.build(), true);
- } else {
- TransactionUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL,
- VpnUtil.getVpnInstanceOpDataIdentifier(primaryRd),
- builder.build(), TransactionUtil.DEFAULT_CALLBACK);
- }
+ writeOperTxn.merge(VpnUtil.getVpnInstanceOpDataIdentifier(primaryRd), builder.build(), CREATE_MISSING_PARENTS);
LOG.info("{} addVpnInstance: VpnInstanceOpData populated successfully for vpn {} rd {}", LOGGING_PREFIX_ADD,
vpnInstanceName, primaryRd);
}
*/
VpnAfConfig config = vpnInstance.getIpv4Family();
List<String> rd = config.getRouteDistinguisher();
- if (rd == null || addBgpVrf(voids)) {
+ if (rd == null || addBgpVrf()) {
notifyTask();
vpnInterfaceManager.vpnInstanceIsReady(vpnName);
}
log.info("{} onSuccess: Vpn Instance Op Data addition for {} successful.", LOGGING_PREFIX_ADD, vpnName);
- VpnInstanceOpDataEntry vpnInstanceOpDataEntry = VpnUtil.getVpnInstanceOpData(dataBroker,
+ VpnInstanceOpDataEntry vpnInstanceOpDataEntry = vpnUtil.getVpnInstanceOpData(
VpnUtil.getPrimaryRd(vpnInstance));
// bind service on each tunnel interface
//TODO (KIRAN): Add a new listener to handle creation of new DC-GW binding and deletion of existing DC-GW.
if (VpnUtil.isL3VpnOverVxLan(vpnInstance.getL3vni())) { //Handled for L3VPN Over VxLAN
for (String tunnelInterfaceName: getDcGatewayTunnelInterfaceNameList()) {
- VpnUtil.bindService(vpnInstance.getVpnInstanceName(), tunnelInterfaceName, dataBroker,
- true/*isTunnelInterface*/, jobCoordinator);
+ vpnUtil.bindService(vpnInstance.getVpnInstanceName(), tunnelInterfaceName,
+ true/*isTunnelInterface*/);
}
// install flow
List<MatchInfo> mkMatches = new ArrayList<>();
- mkMatches.add(new MatchTunnelId(BigInteger.valueOf(vpnInstance.getL3vni())));
+ mkMatches.add(new MatchTunnelId(Uint64.valueOf(vpnInstance.getL3vni())));
List<InstructionInfo> instructions =
Arrays.asList(new InstructionWriteMetadata(MetaDataUtil.getVpnIdMetadata(vpnInstanceOpDataEntry
- .getVpnId()), MetaDataUtil.METADATA_MASK_VRFID),
+ .getVpnId().toJava()), MetaDataUtil.METADATA_MASK_VRFID),
new InstructionGotoTable(NwConstants.L3_GW_MAC_TABLE));
- for (BigInteger dpnId: NWUtil.getOperativeDPNs(dataBroker)) {
+ for (Uint64 dpnId: NWUtil.getOperativeDPNs(dataBroker)) {
String flowRef = getFibFlowRef(dpnId, NwConstants.L3VNI_EXTERNAL_TUNNEL_DEMUX_TABLE,
vpnName, VpnConstants.DEFAULT_FLOW_PRIORITY);
FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpnId,
// TODO Clean up the exception handling
@SuppressWarnings("checkstyle:IllegalCatch")
- private boolean addBgpVrf(List<Void> voids) {
+ private boolean addBgpVrf() {
VpnAfConfig config = vpnInstance.getIpv4Family();
- String primaryRd = VpnUtil.getPrimaryRd(dataBroker, vpnName);
+ String primaryRd = vpnUtil.getPrimaryRd(vpnName);
List<VpnTarget> vpnTargetList = config.getVpnTargets().getVpnTarget();
if (vpnTargetList == null) {
this.vpnName, primaryRd);
return false;
}
+ // FIXME: separate out to somehow?
+ final ReentrantLock lock = JvmGlobalLocks.getLockForString(vpnName);
+ lock.lock();
+ try {
+ fibManager.addVrfTable(primaryRd, null);
+ } finally {
+ lock.unlock();
+ }
vpnInterfaceManager.handleVpnsExportingRoutes(this.vpnName, primaryRd);
return true;
}
}
}
+ @Nullable
protected VpnInstanceOpDataEntry getVpnInstanceOpData(String rd) {
InstanceIdentifier<VpnInstanceOpDataEntry> id = VpnUtil.getVpnInstanceOpDataIdentifier(rd);
- Optional<VpnInstanceOpDataEntry> vpnInstanceOpData =
- TransactionUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
- if (vpnInstanceOpData.isPresent()) {
- return vpnInstanceOpData.get();
+ try {
+ return SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
+ id).orNull();
+ } catch (ReadFailedException e) {
+ throw new RuntimeException("Error reading VPN instance data for " + rd, e);
}
- return null;
}
+ @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD",
+ justification = "https://github.com/spotbugs/spotbugs/issues/811")
private List<String> getDcGatewayTunnelInterfaceNameList() {
List<String> tunnelInterfaceNameList = new ArrayList<>();
-
- InstanceIdentifier<DcGatewayIpList> dcGatewayIpListInstanceIdentifier = InstanceIdentifier
- .create(DcGatewayIpList.class);
- Optional<DcGatewayIpList> dcGatewayIpListOptional = VpnUtil.read(dataBroker,
- LogicalDatastoreType.CONFIGURATION, dcGatewayIpListInstanceIdentifier);
- if (!dcGatewayIpListOptional.isPresent()) {
- LOG.info("No DC gateways configured.");
- return tunnelInterfaceNameList;
- }
- List<DcGatewayIp> dcGatewayIps = dcGatewayIpListOptional.get().getDcGatewayIp();
-
- InstanceIdentifier<ExternalTunnelList> externalTunnelListId = InstanceIdentifier
- .create(ExternalTunnelList.class);
-
- Optional<ExternalTunnelList> externalTunnelListOptional = VpnUtil.read(dataBroker,
- LogicalDatastoreType.OPERATIONAL, externalTunnelListId);
- if (externalTunnelListOptional.isPresent()) {
- List<ExternalTunnel> externalTunnels = externalTunnelListOptional.get().getExternalTunnel();
-
- List<String> externalTunnelIpList = new ArrayList<>();
- for (ExternalTunnel externalTunnel: externalTunnels) {
- externalTunnelIpList.add(externalTunnel.getDestinationDevice());
- }
-
- List<String> dcGatewayIpList = new ArrayList<>();
- for (DcGatewayIp dcGatewayIp: dcGatewayIps) {
- dcGatewayIpList.add(dcGatewayIp.getIpAddress().getIpv4Address().toString());
+ try {
+ InstanceIdentifier<DcGatewayIpList> dcGatewayIpListInstanceIdentifier = InstanceIdentifier
+ .create(DcGatewayIpList.class);
+ Optional<DcGatewayIpList> dcGatewayIpListOptional = SingleTransactionDataBroker.syncReadOptional(
+ dataBroker, LogicalDatastoreType.CONFIGURATION, dcGatewayIpListInstanceIdentifier);
+ if (!dcGatewayIpListOptional.isPresent()) {
+ LOG.info("No DC gateways configured.");
+ return tunnelInterfaceNameList;
}
-
- // Find all externalTunnelIps present in dcGateWayIpList
- List<String> externalTunnelIpsInDcGatewayIpList = new ArrayList<>();
- for (String externalTunnelIp: externalTunnelIpList) {
- for (String dcGateWayIp: dcGatewayIpList) {
- if (externalTunnelIp.contentEquals(dcGateWayIp)) {
- externalTunnelIpsInDcGatewayIpList.add(externalTunnelIp);
+ List<DcGatewayIp> dcGatewayIps = dcGatewayIpListOptional.get().nonnullDcGatewayIp();
+ InstanceIdentifier<ExternalTunnelList> externalTunnelListId = InstanceIdentifier
+ .create(ExternalTunnelList.class);
+ Optional<ExternalTunnelList> externalTunnelListOptional = SingleTransactionDataBroker.syncReadOptional(
+ dataBroker, LogicalDatastoreType.OPERATIONAL, externalTunnelListId);
+ if (externalTunnelListOptional.isPresent()) {
+ List<ExternalTunnel> externalTunnels = externalTunnelListOptional.get().nonnullExternalTunnel();
+ List<String> externalTunnelIpList = new ArrayList<>();
+ for (ExternalTunnel externalTunnel: externalTunnels) {
+ externalTunnelIpList.add(externalTunnel.getDestinationDevice());
+ }
+ List<String> dcGatewayIpList = new ArrayList<>();
+ for (DcGatewayIp dcGatewayIp: dcGatewayIps) {
+ dcGatewayIpList.add(dcGatewayIp.getIpAddress().getIpv4Address().toString());
+ }
+ // Find all externalTunnelIps present in dcGateWayIpList
+ List<String> externalTunnelIpsInDcGatewayIpList = new ArrayList<>();
+ for (String externalTunnelIp: externalTunnelIpList) {
+ for (String dcGateWayIp: dcGatewayIpList) {
+ if (externalTunnelIp.contentEquals(dcGateWayIp)) {
+ externalTunnelIpsInDcGatewayIpList.add(externalTunnelIp);
+ }
}
}
- }
-
-
- for (String externalTunnelIpsInDcGatewayIp: externalTunnelIpsInDcGatewayIpList) {
- for (ExternalTunnel externalTunnel: externalTunnels) {
- if (externalTunnel.getDestinationDevice().contentEquals(externalTunnelIpsInDcGatewayIp)) {
- tunnelInterfaceNameList.add(externalTunnel.getTunnelInterfaceName());
+ for (String externalTunnelIpsInDcGatewayIp: externalTunnelIpsInDcGatewayIpList) {
+ for (ExternalTunnel externalTunnel: externalTunnels) {
+ if (externalTunnel.getDestinationDevice().contentEquals(externalTunnelIpsInDcGatewayIp)) {
+ tunnelInterfaceNameList.add(externalTunnel.getTunnelInterfaceName());
+ }
}
}
- }
+ }
+ } catch (ReadFailedException e) {
+ LOG.error("getDcGatewayTunnelInterfaceNameList: Failed to read data store");
}
return tunnelInterfaceNameList;
}
- private String getFibFlowRef(BigInteger dpnId, short tableId, String vpnName, int priority) {
+ @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD",
+ justification = "https://github.com/spotbugs/spotbugs/issues/811")
+ private String getFibFlowRef(Uint64 dpnId, short tableId, String vpnName, int priority) {
return VpnConstants.FLOWID_PREFIX + dpnId + NwConstants.FLOWID_SEPARATOR + tableId
+ NwConstants.FLOWID_SEPARATOR + vpnName + NwConstants.FLOWID_SEPARATOR + priority;
}