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;
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;
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;
LocatorSet tobeDeleted = buildLocatorSet(dstNodeId, removedDstTep);
RemoteMcastMacsBuilder newMacBuilder = new RemoteMcastMacsBuilder(existingMac);
- List<LocatorSet> existingLocatorList = newMacBuilder.getLocatorSet();
- List<LocatorSet> locatorList = new ArrayList<>();
- existingLocatorList.forEach(locatorSet -> locatorList.add(locatorSet));
+ List<LocatorSet> locatorList = new ArrayList<>(existingMac.nonnullLocatorSet());
locatorList.remove(tobeDeleted);
newMacBuilder.setLocatorSet(locatorList);
RemoteMcastMacs mac = newMacBuilder.build();
ElanDpnInterfacesList elanDpns = elanUtils.getElanDpnInterfacesList(elanInfo.getElanInstanceName());
if (isVxlanNetworkOrVxlanSegment(elanInfo)) {
+ // Adding 270000 to avoid collision between LPort and elan for broadcast group actions
listBucketInfo.addAll(getRemoteBCGroupTunnelBuckets(elanDpns, dpnId, bucketId,
elanUtils.isOpenstackVniSemanticsEnforced()
- ? ElanUtils.getVxlanSegmentationId(elanInfo).longValue() : elanTag));
+ ? ElanUtils.getVxlanSegmentationId(elanInfo).longValue() : elanTag
+ + ElanConstants.ELAN_TAG_ADDEND));
}
listBucketInfo.addAll(getRemoteBCGroupExternalPortBuckets(elanDpns, dpnInterfaces, dpnId,
getNextAvailableBucketId(listBucketInfo.size())));
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();
}
try {
List<Action> listActionInfo = elanItmUtils.getInternalTunnelItmEgressAction(dpnId,
dpnInterface.getDpId(), elanTagOrVni);
+ LOG.trace("configuring broadcast group for elan {} for source DPN {} and destination DPN {} "
+ + "with actions {}", elanTagOrVni, dpnId, dpnInterface.getDpId(), listActionInfo);
if (listActionInfo.isEmpty()) {
continue;
}
* the l2 gateway device
* @return the listenable future
*/
- public List<ListenableFuture<Void>> handleMcastForElanL2GwDeviceDelete(String elanName,
+ public List<FluentFuture<?>> handleMcastForElanL2GwDeviceDelete(String elanName,
L2GatewayDevice l2GatewayDevice) {
- ListenableFuture<Void> deleteTepFuture =
+ FluentFuture<?> deleteTepFuture =
txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION,
tx -> tx.delete(buildExternalTepPath(elanName, l2GatewayDevice.getTunnelIp())));
updateMcastMacsForAllElanDevices(elanName, l2GatewayDevice, false/* updateThisDevice */);
- ListenableFuture<Void> deleteRemoteMcastMacFuture = deleteRemoteMcastMac(
+ FluentFuture<?> deleteRemoteMcastMacFuture = deleteRemoteMcastMac(
new NodeId(l2GatewayDevice.getHwvtepNodeId()), elanName);
return Arrays.asList(deleteRemoteMcastMacFuture, deleteTepFuture);
}
* the logical switch name
* @return the listenable future
*/
- public ListenableFuture<Void> deleteRemoteMcastMac(NodeId nodeId, String logicalSwitchName) {
+ public FluentFuture<? extends @NonNull CommitInfo> deleteRemoteMcastMac(NodeId nodeId, String logicalSwitchName) {
InstanceIdentifier<LogicalSwitches> logicalSwitch = HwvtepSouthboundUtils
.createLogicalSwitchesInstanceIdentifier(nodeId, new HwvtepNodeName(logicalSwitchName));
RemoteMcastMacsKey remoteMcastMacsKey = new RemoteMcastMacsKey(new HwvtepLogicalSwitchRef(logicalSwitch),
*/
public DesignatedSwitchForTunnel getDesignatedSwitchForExternalTunnel(IpAddress tunnelIp,
String elanInstanceName) {
- InstanceIdentifier<DesignatedSwitchForTunnel> instanceIdentifier = InstanceIdentifier
+ try {
+ InstanceIdentifier<DesignatedSwitchForTunnel> instanceIdentifier = InstanceIdentifier
.builder(DesignatedSwitchesForExternalTunnels.class)
- .child(DesignatedSwitchForTunnel.class, new DesignatedSwitchForTunnelKey(elanInstanceName, tunnelIp))
+ .child(DesignatedSwitchForTunnel.class,
+ new DesignatedSwitchForTunnelKey(elanInstanceName, tunnelIp))
.build();
- return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, instanceIdentifier).orNull();
+ return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, instanceIdentifier)
+ .orElse(null);
+ } catch (ExecutionException e) {
+ LOG.error("Exception while retriving DesignatedSwitch for elan {} and tunnel {}",
+ elanInstanceName, tunnelIp, e);
+ } catch (InterruptedException e) {
+ LOG.error("Exception while retriving DesignatedSwitch for elan {} and tunnel {}",
+ elanInstanceName, tunnelIp, e);
+ }
+ return null;
}
}