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