Bug 5061: Introduce BGP OpenConfig mapping service
[bgpcep.git] / bgp / openconfig-impl / src / main / java / org / opendaylight / protocol / bgp / openconfig / impl / BGPOpenConfigMappingServiceImpl.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.protocol.bgp.openconfig.impl;
10
11 import com.google.common.base.Optional;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
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;
31
32 public final class BGPOpenConfigMappingServiceImpl implements BGPOpenConfigMappingService {
33
34     @Override
35     public List<BgpTableType> toTableTypes(final List<AfiSafi> afiSafis) {
36         return afiSafis.stream()
37                 .map(afiSafi -> OpenConfigUtil.toBgpTableType(afiSafi.getAfiSafiName()))
38                 .filter(Optional::isPresent)
39                 .map(Optional::get)
40                 .collect(Collectors.toList());
41     }
42
43     @Override
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;
52                 if (sendMax > 1) {
53                     selectionMode = new AddPathBestNPathSelection(sendMax.longValue());
54                 } else {
55                     selectionMode = new AllPathSelection();
56                 }
57                 pathSelectionModes.put(bgpTableType.get(), selectionMode);
58             }
59         }
60         return pathSelectionModes;
61     }
62
63     @Override
64     public boolean isApplicationPeer(final Neighbor neighbor) {
65         return OpenConfigUtil.isAppNeighbor(neighbor);
66     }
67
68     @Override
69     public PeerRole toPeerRole(final Neighbor neighbor) {
70         return OpenConfigUtil.toPeerRole(neighbor);
71     }
72
73     @Override
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());
83             }
84         }
85         return addPathCapability;
86     }
87
88     private static SendReceive toSendReceiveMode(final AfiSafi2 addPath) {
89         if (addPath.isReceive() && addPath.getSendMax() != null) {
90             return SendReceive.Both;
91         }
92         if (addPath.getSendMax() != null) {
93             return SendReceive.Send;
94         }
95         return SendReceive.Receive;
96     }
97
98 }