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 static org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil.APPLICATION_PEER_GROUP_NAME;
12 import static org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil.toPeerType;
14 import com.google.common.base.Optional;
15 import java.math.BigDecimal;
16 import java.util.ArrayList;
17 import java.util.Collections;
18 import java.util.HashMap;
19 import java.util.List;
21 import java.util.stream.Collectors;
22 import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
23 import org.opendaylight.protocol.bgp.mode.impl.add.all.paths.AllPathSelection;
24 import org.opendaylight.protocol.bgp.mode.impl.add.n.paths.AddPathBestNPathSelection;
25 import org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil;
26 import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
27 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
28 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborAddPathsConfig;
29 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.AfiSafisBuilder;
30 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.ConfigBuilder;
31 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
32 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
33 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
34 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
35 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
36 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
37 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroup;
38 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroupBuilder;
39 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroupKey;
40 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
41 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.BgpBuilder;
42 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
43 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.GlobalBuilder;
44 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.NeighborsBuilder;
45 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.PeerGroups;
46 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.PeerGroupsBuilder;
47 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.CommunityType;
48 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.RrClusterIdType;
49 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
50 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolBuilder;
51 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
52 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.SendReceive;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamilies;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config2;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config2Builder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.GlobalConfigAugmentation;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.GlobalConfigAugmentationBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1Builder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRibId;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.SimpleRoutingPolicy;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.rfc2385.cfg.rev160324.Rfc2385Key;
78 public final class BGPOpenConfigMappingServiceImpl implements BGPOpenConfigMappingService {
80 private static final PeerGroup APP_PEER_GROUP = new PeerGroupBuilder().setPeerGroupName(APPLICATION_PEER_GROUP_NAME)
81 .setKey(new PeerGroupKey(APPLICATION_PEER_GROUP_NAME)).build();
82 private static final PeerGroups PEER_GROUPS = new PeerGroupsBuilder().setPeerGroup(Collections.singletonList(APP_PEER_GROUP)).build();
83 private static final BigDecimal DEFAULT_KEEP_ALIVE = BigDecimal.valueOf(30);
84 private static final BigDecimal DEFAULT_MINIMUM_ADV_INTERVAL = BigDecimal.valueOf(30);
87 public List<BgpTableType> toTableTypes(final List<AfiSafi> afiSafis) {
88 return afiSafis.stream()
89 .map(afiSafi -> OpenConfigUtil.toBgpTableType(afiSafi.getAfiSafiName()))
90 .filter(Optional::isPresent)
92 .collect(Collectors.toList());
96 public Map<BgpTableType, PathSelectionMode> toPathSelectionMode(final List<AfiSafi> afiSafis) {
97 final Map<BgpTableType, PathSelectionMode> pathSelectionModes = new HashMap<>();
98 for (final AfiSafi afiSafi : afiSafis) {
99 final BgpNeighborAddPathsConfig afiSafi2 = afiSafi.getAugmentation(AfiSafi2.class);
100 final Optional<BgpTableType> bgpTableType = OpenConfigUtil.toBgpTableType(afiSafi.getAfiSafiName());
101 if (afiSafi2 != null && bgpTableType.isPresent()) {
102 final Short sendMax = afiSafi2.getSendMax();
103 final PathSelectionMode selectionMode;
105 selectionMode = new AddPathBestNPathSelection(sendMax.longValue());
107 selectionMode = new AllPathSelection();
109 pathSelectionModes.put(bgpTableType.get(), selectionMode);
112 return pathSelectionModes;
116 public boolean isApplicationPeer(final Neighbor neighbor) {
117 return OpenConfigUtil.isAppNeighbor(neighbor);
121 public PeerRole toPeerRole(final Neighbor neighbor) {
122 return OpenConfigUtil.toPeerRole(neighbor);
126 public List<AddressFamilies> toAddPathCapability(final List<AfiSafi> afiSafis) {
127 final List<AddressFamilies> addPathCapability = new ArrayList<>();
128 for (final AfiSafi afiSafi : afiSafis) {
129 final BgpNeighborAddPathsConfig afiSafi1 = afiSafi.getAugmentation(AfiSafi1.class);
130 final Optional<BgpTableType> bgpTableType = OpenConfigUtil.toBgpTableType(afiSafi.getAfiSafiName());
131 if (afiSafi1 != null && bgpTableType.isPresent()) {
132 final AddressFamiliesBuilder builder = new AddressFamiliesBuilder(bgpTableType.get());
133 builder.setSendReceive(toSendReceiveMode(afiSafi1));
134 addPathCapability.add(builder.build());
137 return addPathCapability;
140 private static SendReceive toSendReceiveMode(final BgpNeighborAddPathsConfig addPath) {
141 if (addPath.isReceive() && addPath.getSendMax() != null) {
142 return SendReceive.Both;
144 if (addPath.getSendMax() != null) {
145 return SendReceive.Send;
147 return SendReceive.Receive;
151 public Protocol fromRib(final BgpId bgpId, final ClusterIdentifier clusterIdentifier, final RibId ribId,
152 final AsNumber localAs, final List<BgpTableType> localTables,
153 final Map<TablesKey, PathSelectionMode> pathSelectionStrategies) {
154 final Bgp bgp = toGlobalConfiguration(bgpId, clusterIdentifier, localAs, localTables, pathSelectionStrategies);
155 final ProtocolBuilder protocolBuilder = new ProtocolBuilder();
156 protocolBuilder.setIdentifier(BGP.class);
157 protocolBuilder.setName(ribId.getValue());
158 protocolBuilder.setKey(new ProtocolKey(protocolBuilder.getIdentifier(), protocolBuilder.getName()));
159 return protocolBuilder.addAugmentation(Protocol1.class, new Protocol1Builder().setBgp(bgp).build()).build();
162 private static Bgp toGlobalConfiguration(final BgpId bgpId, final ClusterIdentifier clusterIdentifier,
163 final AsNumber localAs, final List<BgpTableType> localTables,
164 final Map<TablesKey, PathSelectionMode> pathSelectionStrategies) {
165 final BgpBuilder bgpBuilder = new BgpBuilder();
166 bgpBuilder.setNeighbors(new NeighborsBuilder().build());
167 bgpBuilder.setPeerGroups(PEER_GROUPS);
168 final ConfigBuilder configBuilder = new ConfigBuilder();
169 configBuilder.setAs(localAs);
170 configBuilder.setRouterId(bgpId);
171 if (clusterIdentifier != null) {
172 configBuilder.addAugmentation(GlobalConfigAugmentation.class,
173 new GlobalConfigAugmentationBuilder().setRouteReflectorClusterId(new RrClusterIdType(clusterIdentifier)).build());
175 final Global global = new GlobalBuilder().setAfiSafis(new AfiSafisBuilder().setAfiSafi(OpenConfigUtil.toAfiSafis(localTables,
176 (afiSafi, tableType) -> OpenConfigUtil.toGlobalAfiSafiAddPath(afiSafi, tableType, pathSelectionStrategies))).build())
177 .setConfig(configBuilder.build()).build();
178 bgpBuilder.setGlobal(global);
179 return bgpBuilder.build();
183 public Neighbor fromBgpPeer(final List<AddressFamilies> addPathCapabilities,
184 final List<BgpTableType> advertisedTables, final Integer holdTimer, final IpAddress ipAddress,
185 final Boolean isActive, final Rfc2385Key password, final PortNumber portNumber, final Integer retryTimer,
186 final AsNumber remoteAs, final PeerRole peerRole, final SimpleRoutingPolicy simpleRoutingPolicy) {
187 final NeighborBuilder neighborBuilder = new NeighborBuilder();
188 neighborBuilder.setNeighborAddress(ipAddress);
189 neighborBuilder.setKey(new NeighborKey(ipAddress));
190 neighborBuilder.setAfiSafis(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder().setAfiSafi(OpenConfigUtil.toAfiSafis(advertisedTables,
191 (afiSafi, tableType) -> OpenConfigUtil.toNeighborAfiSafiAddPath(afiSafi, tableType, addPathCapabilities))).build());
192 neighborBuilder.setTransport(new TransportBuilder().setConfig(
193 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.ConfigBuilder()
194 .setPassiveMode(!isActive)
195 .setMtuDiscovery(Boolean.FALSE)
196 .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1.class,
197 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1Builder()
198 .setRemotePort(portNumber).build())
200 neighborBuilder.setConfig(
201 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder()
202 .setAuthPassword(password != null ? password.getValue() : null)
204 .setPeerType(toPeerType(peerRole))
205 .setSendCommunity(CommunityType.NONE)
206 .setRouteFlapDamping(Boolean.FALSE)
208 neighborBuilder.setTimers(new TimersBuilder().setConfig(
209 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.timers.ConfigBuilder()
210 .setHoldTime(BigDecimal.valueOf(holdTimer))
211 .setConnectRetry(BigDecimal.valueOf(retryTimer))
212 .setKeepaliveInterval(DEFAULT_KEEP_ALIVE)
213 .setMinimumAdvertisementInterval(DEFAULT_MINIMUM_ADV_INTERVAL)
215 neighborBuilder.setRouteReflector(new RouteReflectorBuilder().setConfig(
216 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.route.reflector.ConfigBuilder()
217 .setRouteReflectorClient(peerRole == PeerRole.RrClient).build()).build());
218 return neighborBuilder.build();
222 public Neighbor fromApplicationPeer(final ApplicationRibId applicationRibId, final BgpId bgpId) {
223 final NeighborBuilder neighborBuilder = new NeighborBuilder();
224 neighborBuilder.setNeighborAddress(new IpAddress(new Ipv4Address(bgpId.getValue())));
225 neighborBuilder.setKey(new NeighborKey(neighborBuilder.getNeighborAddress()));
226 neighborBuilder.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder()
227 .setDescription(applicationRibId.getValue())
228 .addAugmentation(Config2.class, new Config2Builder().setPeerGroup(APPLICATION_PEER_GROUP_NAME).build())
231 return neighborBuilder.build();