Bump versions to 0.21.7-SNAPSHOT
[bgpcep.git] / bgp / rib-impl / src / test / java / org / opendaylight / protocol / bgp / rib / impl / PeerUtil.java
1 /*
2  * Copyright (c) 2018 AT&T Intellectual Property. 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 package org.opendaylight.protocol.bgp.rib.impl;
9
10 import java.util.ArrayList;
11 import java.util.List;
12 import java.util.Map;
13 import java.util.function.Function;
14 import java.util.stream.Collectors;
15 import org.opendaylight.protocol.bgp.parser.spi.PathIdUtil;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev180329.ipv4.prefixes.DestinationIpv4Builder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev180329.ipv4.prefixes.destination.ipv4.Ipv4PrefixesBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev180329.ipv6.prefixes.DestinationIpv6Builder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev180329.ipv6.prefixes.destination.ipv6.Ipv6PrefixesBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev180329.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationIpv4CaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev180329.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationIpv6CaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.Update;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.UpdateBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.BgpParameters;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.BgpParametersBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.OptionalCapabilities;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.OptionalCapabilitiesBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.optional.capabilities.CParametersBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.AttributesBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.attributes.AsPath;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.attributes.AsPathBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.attributes.LocalPref;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.attributes.LocalPrefBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.attributes.Origin;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.attributes.OriginBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.attributes.as.path.Segments;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.AttributesReachBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.AttributesUnreachBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.CParameters1Builder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.SendReceive;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.reach.MpReachNlri;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.reach.MpReachNlriBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.reach.mp.reach.nlri.AdvertizedRoutesBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.unreach.MpUnreachNlri;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.destination.DestinationType;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.AddPathCapabilityBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.GracefulRestartCapability;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.GracefulRestartCapabilityBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.MultiprotocolCapabilityBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.graceful.restart.capability.Tables;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.graceful.restart.capability.TablesBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.AddressFamily;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.BgpOrigin;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv6AddressFamily;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.CNextHop;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.Ipv6NextHopCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder;
68 import org.opendaylight.yangtools.yang.common.Uint16;
69 import org.opendaylight.yangtools.yang.common.Uint32;
70
71 final class PeerUtil {
72     private PeerUtil() {
73         // Hidden on purpose
74     }
75
76     static MpReachNlri createMpReachNlri(final IpAddressNoZone nextHop, final List<IpPrefix> prefixes) {
77         final AddressFamily afi;
78         final CNextHop cNextHop;
79         final DestinationType destinationType;
80         if (nextHop.getIpv4AddressNoZone() != null) {
81             afi = Ipv4AddressFamily.VALUE;
82             cNextHop = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder()
83                     .setGlobal(nextHop.getIpv4AddressNoZone())
84                     .build()).build();
85             destinationType = new DestinationIpv4CaseBuilder().setDestinationIpv4(
86                     new DestinationIpv4Builder().setIpv4Prefixes(prefixes.stream()
87                             .map(prefix -> new Ipv4PrefixesBuilder()
88                                     .setPathId(PathIdUtil.NON_PATH_ID)
89                                     .setPrefix(new Ipv4Prefix(prefix.getIpv4Prefix())).build())
90                             .collect(Collectors.toList()))
91                             .build()).build();
92         } else {
93             afi = Ipv6AddressFamily.VALUE;
94             cNextHop = new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder()
95                     .setGlobal(nextHop.getIpv6AddressNoZone())
96                     .build()).build();
97             destinationType = new DestinationIpv6CaseBuilder().setDestinationIpv6(
98                     new DestinationIpv6Builder().setIpv6Prefixes(prefixes.stream()
99                             .map(prefix -> new Ipv6PrefixesBuilder()
100                                     .setPathId(PathIdUtil.NON_PATH_ID)
101                                     .setPrefix(new Ipv6Prefix(prefix.getIpv6Prefix())).build())
102                             .collect(Collectors.toList()))
103                             .build()).build();
104         }
105
106         return new MpReachNlriBuilder()
107                 .setCNextHop(cNextHop)
108                 .setAfi(afi)
109                 .setSafi(UnicastSubsequentAddressFamily.VALUE)
110                 .setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(destinationType).build())
111                 .build();
112     }
113
114     static Update createUpdate(final BgpOrigin bgpOrigin,
115                                final List<Segments> pathSegments,
116                                // FIXME: consider using Uint32
117                                final long preference,
118                                final MpReachNlri mpReach,
119                                final MpUnreachNlri mpUnreach) {
120         final Origin origin = new OriginBuilder().setValue(bgpOrigin).build();
121         final AsPath asPath = new AsPathBuilder().setSegments(pathSegments).build();
122         final LocalPref localPref = new LocalPrefBuilder().setPref(Uint32.valueOf(preference)).build();
123         final AttributesBuilder attributeBuilder = new AttributesBuilder()
124                 .setOrigin(origin).setAsPath(asPath).setLocalPref(localPref);
125
126         if (mpReach != null) {
127             attributeBuilder.addAugmentation(new AttributesReachBuilder().setMpReachNlri(mpReach).build());
128         }
129
130         if (mpUnreach != null) {
131             attributeBuilder.addAugmentation(new AttributesUnreachBuilder().setMpUnreachNlri(mpUnreach).build());
132         }
133
134         return new UpdateBuilder()
135                 .setAttributes(new AttributesBuilder()
136                         .setOrigin(origin)
137                         .setAsPath(asPath)
138                         .setLocalPref(localPref)
139                         .addAugmentation(new AttributesReachBuilder().setMpReachNlri(mpReach).build())
140                         .build()).build();
141     }
142
143     static BgpParameters createBgpParameters(final List<TablesKey> advertisedTables,
144                                              final List<TablesKey> addPathTables,
145                                              final Map<TablesKey, Boolean> gracefulTabes,
146                                              final int gracefulTimer) {
147         final List<OptionalCapabilities> capabilities = new ArrayList<>();
148         advertisedTables.forEach(key -> capabilities.add(createMultiprotocolCapability(key)));
149         if (addPathTables != null && !addPathTables.isEmpty()) {
150             capabilities.add(createAddPathCapability(addPathTables));
151         }
152         if (gracefulTabes != null && !gracefulTabes.isEmpty()) {
153             capabilities.add(createGracefulRestartCapability(gracefulTabes, gracefulTimer));
154         }
155         return new BgpParametersBuilder().setOptionalCapabilities(capabilities).build();
156     }
157
158     private static OptionalCapabilities createMultiprotocolCapability(final TablesKey key) {
159         return new OptionalCapabilitiesBuilder()
160                 .setCParameters(new CParametersBuilder()
161                     .addAugmentation(new CParameters1Builder()
162                         .setMultiprotocolCapability(new MultiprotocolCapabilityBuilder()
163                             .setAfi(key.getAfi())
164                             .setSafi(key.getSafi())
165                             .build())
166                         .build())
167                     .build())
168                 .build();
169     }
170
171     private static OptionalCapabilities createGracefulRestartCapability(final Map<TablesKey, Boolean> gracefulTables,
172                                                                         final int restartTime) {
173         return new OptionalCapabilitiesBuilder()
174                 .setCParameters(new CParametersBuilder()
175                     .addAugmentation(new CParameters1Builder()
176                         .setGracefulRestartCapability(new GracefulRestartCapabilityBuilder()
177                             .setRestartFlags(new GracefulRestartCapability.RestartFlags(false))
178                             .setRestartTime(Uint16.valueOf(restartTime))
179                             .setTables(gracefulTables.keySet().stream()
180                                 .map(key -> new TablesBuilder()
181                                     .setAfi(key.getAfi())
182                                     .setSafi(key.getSafi())
183                                     .setAfiFlags(new Tables.AfiFlags(gracefulTables.get(key)))
184                                     .build())
185                                 .collect(Collectors.toUnmodifiableMap(Tables::key, Function.identity())))
186                             .build())
187                         .build())
188                     .build())
189                 .build();
190     }
191
192     private static OptionalCapabilities createAddPathCapability(final List<TablesKey> keys) {
193         return new OptionalCapabilitiesBuilder()
194                 .setCParameters(new CParametersBuilder()
195                     .addAugmentation(new CParameters1Builder()
196                         .setAddPathCapability(new AddPathCapabilityBuilder()
197                             .setAddressFamilies(keys.stream()
198                                 .map(key -> new AddressFamiliesBuilder()
199                                     .setAfi(key.getAfi())
200                                     .setSafi(key.getSafi())
201                                     .setSendReceive(SendReceive.Both)
202                                     .build())
203                                 .collect(Collectors.toList()))
204                             .build())
205                         .build())
206                     .build())
207                 .build();
208     }
209 }