import static com.google.common.base.Preconditions.checkState;
import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil.INSTANCE;
-import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import java.util.function.Function;
import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.BgpCommonAfiSafiList;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiKey;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborAddPathsConfig;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborGroup;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborTransportConfig;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerRole;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.ClusterIdentifier;
-import org.opendaylight.yangtools.yang.binding.Augmentation;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.Uint16;
static final Optional<String> APPLICATION_PEER_GROUP_NAME_OPT = Optional.of(APPLICATION_PEER_GROUP_NAME);
static final int HOLDTIMER = 90;
private static final AfiSafi IPV4_AFISAFI = new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build();
- private static final List<AfiSafi> DEFAULT_AFISAFI = ImmutableList.of(IPV4_AFISAFI);
+ private static final Map<AfiSafiKey, AfiSafi> DEFAULT_AFISAFI = ImmutableMap.of(IPV4_AFISAFI.key(), IPV4_AFISAFI);
private static final int CONNECT_RETRY = 30;
private static final PortNumber PORT = new PortNumber(Uint16.valueOf(179).intern());
}
//make sure IPv4 Unicast (RFC 4271) when required
- static List<AfiSafi> getAfiSafiWithDefault(
+ static Map<AfiSafiKey, AfiSafi> getAfiSafiWithDefault(
final BgpCommonAfiSafiList afiSAfis, final boolean setDeafultIPv4) {
if (afiSAfis == null || afiSAfis.getAfiSafi() == null) {
- return setDeafultIPv4 ? DEFAULT_AFISAFI : Collections.emptyList();
- }
- final List<AfiSafi> afiSafi = afiSAfis.getAfiSafi();
- if (setDeafultIPv4) {
- final boolean anyMatch = afiSafi.stream()
- .anyMatch(input -> input.getAfiSafiName().equals(IPV4UNICAST.class));
- if (!anyMatch) {
- final List<AfiSafi> newAfiSafi = new ArrayList<>(afiSafi.size() + 1);
- newAfiSafi.addAll(afiSafi);
- newAfiSafi.add(IPV4_AFISAFI);
- return newAfiSafi;
- }
+ return setDeafultIPv4 ? DEFAULT_AFISAFI : Collections.emptyMap();
+ }
+ final Map<AfiSafiKey, AfiSafi> afiSafi = afiSAfis.nonnullAfiSafi();
+ if (setDeafultIPv4 && !afiSafi.containsKey(IPV4_AFISAFI.key())) {
+ final Map<AfiSafiKey, AfiSafi> newAfiSafi = Maps.newHashMapWithExpectedSize(afiSafi.size() + 1);
+ newAfiSafi.putAll(afiSafi);
+ newAfiSafi.put(IPV4_AFISAFI.key(), IPV4_AFISAFI);
+ return newAfiSafi;
}
return afiSafi;
}
return null;
}
- static Map<BgpTableType, PathSelectionMode> toPathSelectionMode(final List<AfiSafi> afiSafis,
+ static Map<BgpTableType, PathSelectionMode> toPathSelectionMode(final Collection<AfiSafi> afiSafis,
final BGPTableTypeRegistryConsumer tableTypeRegistry) {
final Map<BgpTableType, PathSelectionMode> pathSelectionModes = new HashMap<>();
for (final AfiSafi afiSafi : afiSafis) {
return false;
}
- static List<AddressFamilies> toAddPathCapability(final List<AfiSafi> afiSafis,
+ static List<AddressFamilies> toAddPathCapability(final Collection<AfiSafi> afiSafis,
final BGPTableTypeRegistryConsumer tableTypeRegistry) {
final List<AddressFamilies> addPathCapability = new ArrayList<>();
for (final AfiSafi afiSafi : afiSafis) {
return false;
}
- static List<BgpTableType> toTableTypes(final List<AfiSafi> afiSafis,
+ static List<BgpTableType> toTableTypes(final Collection<AfiSafi> afiSafis,
final BGPTableTypeRegistryConsumer tableTypeRegistry) {
return afiSafis.stream()
.map(afiSafi -> tableTypeRegistry.getTableType(afiSafi.getAfiSafiName()))
.collect(Collectors.toList());
}
- static Set<TablesKey> toTableKey(final List<AfiSafi> afiSafis, final BGPTableTypeRegistryConsumer
+ static Set<TablesKey> toTableKey(final Map<AfiSafiKey, AfiSafi> afiSafis, final BGPTableTypeRegistryConsumer
tableTypeRegistry) {
- return afiSafis.stream()
+ return afiSafis.values().stream()
.map(afiSafi -> tableTypeRegistry.getTableKey(afiSafi.getAfiSafiName()))
.filter(Optional::isPresent)
.map(Optional::get)
static @NonNull PortNumber getPort(final Neighbor neighbor, final PeerGroup peerGroup) {
PortNumber port = null;
if (peerGroup != null) {
- port = getPort(peerGroup.getTransport(), PeerGroupTransportConfig.class);
+ port = getPort(peerGroup.getTransport(), config -> config.augmentation(PeerGroupTransportConfig.class));
}
if (port == null) {
- port = getPort(neighbor.getTransport(), NeighborTransportConfig.class);
+ port = getPort(neighbor.getTransport(), config -> config.augmentation(NeighborTransportConfig.class));
}
if (port == null) {
return port;
}
- private static <T extends TransportConfig & Augmentation<Config>> @Nullable PortNumber getPort(
- final @Nullable Transport transport, final Class<T> augment) {
+ private static @Nullable PortNumber getPort(final @Nullable Transport transport,
+ final Function<Config, TransportConfig> extractConfig) {
if (transport != null) {
final Config config = transport.getConfig();
if (config != null) {
- final T peerTc = config.augmentation(augment);
+ final TransportConfig peerTc = extractConfig.apply(config);
if (peerTc != null) {
return peerTc.getRemotePort();
}