2 * Copyright (c) 2015 Cisco Systems, Inc. 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
9 package org.opendaylight.protocol.bgp.openconfig.impl;
11 import com.google.common.base.Optional;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
16 import java.util.stream.Collectors;
17 import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
18 import org.opendaylight.protocol.bgp.mode.impl.add.all.paths.AllPathSelection;
19 import org.opendaylight.protocol.bgp.mode.impl.add.n.paths.AddPathBestNPathSelection;
20 import org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil;
21 import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
22 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
23 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.SendReceive;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamilies;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
32 public final class BGPOpenConfigMappingServiceImpl implements BGPOpenConfigMappingService {
35 public List<BgpTableType> toTableTypes(final List<AfiSafi> afiSafis) {
36 return afiSafis.stream()
37 .map(afiSafi -> OpenConfigUtil.toBgpTableType(afiSafi.getAfiSafiName()))
38 .filter(Optional::isPresent)
40 .collect(Collectors.toList());
44 public Map<BgpTableType, PathSelectionMode> toPathSelectionMode(final List<AfiSafi> afiSafis) {
45 final Map<BgpTableType, PathSelectionMode> pathSelectionModes = new HashMap<>();
46 for (final AfiSafi afiSafi : afiSafis) {
47 final AfiSafi1 afiSafi1 = afiSafi.getAugmentation(AfiSafi1.class);
48 final Optional<BgpTableType> bgpTableType = OpenConfigUtil.toBgpTableType(afiSafi.getAfiSafiName());
49 if (afiSafi1 != null && bgpTableType.isPresent()) {
50 final Short sendMax = afiSafi1.getSendMax();
51 final PathSelectionMode selectionMode;
53 selectionMode = new AddPathBestNPathSelection(sendMax.longValue());
55 selectionMode = new AllPathSelection();
57 pathSelectionModes.put(bgpTableType.get(), selectionMode);
60 return pathSelectionModes;
64 public boolean isApplicationPeer(final Neighbor neighbor) {
65 return OpenConfigUtil.isAppNeighbor(neighbor);
69 public PeerRole toPeerRole(final Neighbor neighbor) {
70 return OpenConfigUtil.toPeerRole(neighbor);
74 public List<AddressFamilies> toAddPathCapability(final List<AfiSafi> afiSafis) {
75 final List<AddressFamilies> addPathCapability = new ArrayList<>();
76 for (final AfiSafi afiSafi : afiSafis) {
77 final AfiSafi2 afiSafi2 = afiSafi.getAugmentation(AfiSafi2.class);
78 final Optional<BgpTableType> bgpTableType = OpenConfigUtil.toBgpTableType(afiSafi.getAfiSafiName());
79 if (afiSafi2 != null && bgpTableType.isPresent()) {
80 final AddressFamiliesBuilder builder = new AddressFamiliesBuilder(bgpTableType.get());
81 builder.setSendReceive(toSendReceiveMode(afiSafi2));
82 addPathCapability.add(builder.build());
85 return addPathCapability;
88 private static SendReceive toSendReceiveMode(final AfiSafi2 addPath) {
89 if (addPath.isReceive() && addPath.getSendMax() != null) {
90 return SendReceive.Both;
92 if (addPath.getSendMax() != null) {
93 return SendReceive.Send;
95 return SendReceive.Receive;