Update MRI projects for Aluminium
[bgpcep.git] / bgp / topology-provider / src / main / java / org / opendaylight / bgpcep / bgp / topology / provider / ProtocolUtil.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.bgpcep.bgp.topology.provider;
9
10 import com.google.common.io.BaseEncoding;
11 import java.math.BigDecimal;
12 import java.nio.ByteBuffer;
13 import java.util.ArrayList;
14 import java.util.Collection;
15 import java.util.List;
16 import java.util.stream.Collectors;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.IsisAreaIdentifier;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.NodeFlagBits;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.NodeIdentifier;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.TopologyIdentifier;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.link._case.LinkDescriptors;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.path.attribute.link.state.attribute.link.attributes._case.LinkAttributes;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.path.attribute.link.state.attribute.node.attributes._case.NodeAttributes;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.path.attribute.link.state.attribute.prefix.attributes._case.PrefixAttributes;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.routes.linkstate.routes.LinkstateRoute;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.identifier.CRouterIdentifier;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.identifier.c.router.identifier.IsisNodeCase;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.identifier.c.router.identifier.IsisPseudonodeCase;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.identifier.c.router.identifier.OspfNodeCase;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.identifier.c.router.identifier.OspfPseudonodeCase;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.identifier.c.router.identifier.isis.node._case.IsisNode;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.identifier.c.router.identifier.isis.pseudonode._case.IsisPseudonode;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.identifier.c.router.identifier.ospf.pseudonode._case.OspfPseudonode;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.Bandwidth;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.SrlgId;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IsoNetId;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IsoPseudonodeId;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IsoSystemId;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.IsisLinkAttributesBuilder;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.IsisNodeAttributesBuilder;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.IsoBuilder;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.ted.rev131021.srlg.attributes.SrlgValues;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.ted.rev131021.srlg.attributes.SrlgValuesBuilder;
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.ted.rev131021.ted.link.attributes.SrlgBuilder;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.ted.rev131021.ted.link.attributes.UnreservedBandwidth;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.ted.rev131021.ted.link.attributes.UnreservedBandwidthBuilder;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.ted.rev131021.ted.link.attributes.UnreservedBandwidthKey;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.link.attributes.IgpLinkAttributesBuilder;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributesBuilder;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.igp.node.attributes.PrefixBuilder;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.Prefix1Builder;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.OspfLinkAttributesBuilder;
53 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.OspfNodeAttributesBuilder;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.router.type.AbrBuilder;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.router.type.InternalBuilder;
56 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.router.type.PseudonodeBuilder;
57 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.prefix.attributes.OspfPrefixAttributesBuilder;
58 import org.opendaylight.yangtools.yang.common.Empty;
59 import org.opendaylight.yangtools.yang.common.Uint8;
60
61 public final class ProtocolUtil {
62     private ProtocolUtil() {
63         // Hidden on purpose
64     }
65
66     public static void augmentProtocolId(final LinkstateRoute value, final PrefixAttributes pa,
67             final PrefixBuilder pb) {
68         switch (value.getProtocolId()) {
69             case Direct:
70             case IsisLevel1:
71             case IsisLevel2:
72             case Static:
73             case Ospf:
74                 if (pa != null && pa.getOspfForwardingAddress() != null) {
75                     pb.addAugmentation(new Prefix1Builder().setOspfPrefixAttributes(
76                             new OspfPrefixAttributesBuilder().setForwardingAddress(pa.getOspfForwardingAddress()
77                                     .getIpv4AddressNoZone()).build()).build());
78                 }
79                 break;
80             default:
81                 break;
82         }
83     }
84
85     public static void augmentProtocolId(final LinkstateRoute value, final IgpNodeAttributesBuilder inab,
86             final NodeAttributes na, final NodeIdentifier nd) {
87         switch (value.getProtocolId()) {
88             case Direct:
89             case Static:
90             case IsisLevel1:
91             case IsisLevel2:
92                 inab.addAugmentation(isisNodeAttributes(nd, na));
93                 break;
94             case Ospf:
95                 inab.addAugmentation(ospfNodeAttributes(nd, na));
96                 break;
97             default:
98                 break;
99         }
100     }
101
102     public static void augmentProtocolId(final LinkstateRoute value, final IgpLinkAttributesBuilder ilab,
103             final LinkAttributes la, final LinkDescriptors ld) {
104         switch (value.getProtocolId()) {
105             case Direct:
106             case Static:
107             case IsisLevel1:
108             case IsisLevel2:
109                 ilab.addAugmentation(isisLinkAttributes(ld.getMultiTopologyId(), la));
110                 break;
111             case OspfV3:
112             case Ospf:
113                 ilab.addAugmentation(ospfLinkAttributes(ld.getMultiTopologyId(), la));
114                 break;
115             default:
116                 break;
117         }
118     }
119
120     private static org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021
121             .IgpNodeAttributes1 isisNodeAttributes(final NodeIdentifier node, final NodeAttributes na) {
122         final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node
123                 .attributes.isis.node.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml
124                 .ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.TedBuilder();
125         final IsisNodeAttributesBuilder ab = new IsisNodeAttributesBuilder();
126
127         if (na != null) {
128             if (na.getIpv4RouterId() != null) {
129                 tb.setTeRouterIdIpv4(na.getIpv4RouterId());
130             }
131             if (na.getIpv6RouterId() != null) {
132                 tb.setTeRouterIdIpv6(na.getIpv6RouterId());
133             }
134             if (na.getTopologyIdentifier() != null) {
135                 ab.setMultiTopologyId(nodeMultiTopology(na.getTopologyIdentifier()));
136             }
137         }
138
139         final CRouterIdentifier ri = node.getCRouterIdentifier();
140         if (ri instanceof IsisPseudonodeCase) {
141             final IsisPseudonode pn = ((IsisPseudonodeCase) ri).getIsisPseudonode();
142             final IsoBuilder b = new IsoBuilder();
143             final String systemId = UriBuilder.isoId(pn.getIsIsRouterIdentifier().getIsoSystemId());
144             b.setIsoSystemId(new IsoSystemId(systemId));
145             b.setIsoPseudonodeId(new IsoPseudonodeId(BaseEncoding.base16()
146                     .encode(new byte[]{pn.getPsn().byteValue()})));
147             ab.setIso(b.build());
148             if (na != null) {
149                 ab.setNet(toIsoNetIds(na.getIsisAreaId(), systemId));
150             }
151         } else if (ri instanceof IsisNodeCase) {
152             final IsisNode in = ((IsisNodeCase) ri).getIsisNode();
153             final String systemId = UriBuilder.isoId(in.getIsoSystemId());
154             ab.setIso(new IsoBuilder().setIsoSystemId(new IsoSystemId(systemId)).build());
155             if (na != null) {
156                 ab.setNet(toIsoNetIds(na.getIsisAreaId(), systemId));
157             }
158         }
159
160         ab.setTed(tb.build());
161
162         return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021
163                 .IgpNodeAttributes1Builder().setIsisNodeAttributes(ab.build()).build();
164     }
165
166     private static org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021
167             .IgpNodeAttributes1 ospfNodeAttributes(
168             final NodeIdentifier node, final NodeAttributes na) {
169         final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node
170                 .attributes.ospf.node.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd
171                 .params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder();
172         final OspfNodeAttributesBuilder ab = new OspfNodeAttributesBuilder();
173         if (na != null) {
174             if (na.getIpv4RouterId() != null) {
175                 tb.setTeRouterIdIpv4(na.getIpv4RouterId());
176             }
177             if (na.getIpv6RouterId() != null) {
178                 tb.setTeRouterIdIpv6(na.getIpv6RouterId());
179             }
180             if (na.getTopologyIdentifier() != null) {
181                 ab.setMultiTopologyId(nodeMultiTopology(na.getTopologyIdentifier()));
182             }
183             final CRouterIdentifier ri = node.getCRouterIdentifier();
184             if (ri instanceof OspfPseudonodeCase) {
185                 final OspfPseudonode pn = ((OspfPseudonodeCase) ri).getOspfPseudonode();
186
187                 ab.setRouterType(new PseudonodeBuilder().setPseudonode(Empty.getInstance()).build());
188                 ab.setDrInterfaceId(pn.getLanInterface().getValue());
189             } else if (ri instanceof OspfNodeCase && na.getNodeFlags() != null) {
190                 // TODO: what should we do with in.getOspfRouterId()?
191
192                 final NodeFlagBits nf = na.getNodeFlags();
193                 if (nf.isAbr() != null) {
194                     ab.setRouterType(new AbrBuilder().setAbr(nf.isAbr() ? Empty.getInstance() : null).build());
195                 } else if (nf.isExternal() != null) {
196                     ab.setRouterType(new InternalBuilder().setInternal(nf.isExternal() ? null : Empty.getInstance())
197                         .build());
198                 }
199             }
200         }
201         ab.setTed(tb.build());
202         return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021
203                 .IgpNodeAttributes1Builder().setOspfNodeAttributes(ab.build()).build();
204     }
205
206
207     private static List<IsoNetId> toIsoNetIds(final List<IsisAreaIdentifier> areaIds, final String systemId) {
208         return areaIds.stream().map(input -> new IsoNetId(UriBuilder.toIsoNetId(input, systemId)))
209                 .collect(Collectors.toList());
210     }
211
212     private static List<Uint8> nodeMultiTopology(final List<TopologyIdentifier> list) {
213         final List<Uint8> ret = new ArrayList<>(list.size());
214         for (final TopologyIdentifier id : list) {
215             ret.add(Uint8.valueOf(id.getValue()));
216         }
217         return ret;
218     }
219
220     private static org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021
221             .IgpLinkAttributes1 ospfLinkAttributes(final TopologyIdentifier topologyIdentifier,
222             final LinkAttributes la) {
223         final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes
224                 .ospf.link.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
225                 .ospf.topology.rev131021.ospf.link.attributes.ospf.link.attributes.TedBuilder();
226
227         if (la != null) {
228             if (la.getAdminGroup() != null) {
229                 tb.setColor(la.getAdminGroup().getValue());
230             }
231             if (la.getTeMetric() != null) {
232                 tb.setTeDefaultMetric(la.getTeMetric().getValue());
233             }
234             if (la.getUnreservedBandwidth() != null) {
235                 tb.setUnreservedBandwidth(unreservedBandwidthList(la.nonnullUnreservedBandwidth().values()));
236             }
237             if (la.getMaxLinkBandwidth() != null) {
238                 tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth()));
239             }
240             if (la.getMaxReservableBandwidth() != null) {
241                 tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth()));
242             }
243             if (la.getSharedRiskLinkGroups() != null) {
244                 final List<SrlgValues> srlgs = new ArrayList<>();
245                 for (final SrlgId id : la.getSharedRiskLinkGroups()) {
246                     srlgs.add(new SrlgValuesBuilder().setSrlgValue(id.getValue()).build());
247                 }
248                 tb.setSrlg(new SrlgBuilder().setSrlgValues(srlgs).build());
249             }
250         }
251
252         final OspfLinkAttributesBuilder ilab = new OspfLinkAttributesBuilder();
253         ilab.setTed(tb.build());
254         if (topologyIdentifier != null) {
255             ilab.setMultiTopologyId(Uint8.valueOf(topologyIdentifier.getValue()));
256         }
257
258         return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021
259                 .IgpLinkAttributes1Builder().setOspfLinkAttributes(ilab.build()).build();
260     }
261
262
263     private static org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021
264             .IgpLinkAttributes1 isisLinkAttributes(
265             final TopologyIdentifier topologyIdentifier, final LinkAttributes la) {
266         final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis
267                 .link.attributes.isis.link.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params
268                 .xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder();
269
270         if (la != null) {
271             if (la.getAdminGroup() != null) {
272                 tb.setColor(la.getAdminGroup().getValue());
273             }
274             if (la.getTeMetric() != null) {
275                 tb.setTeDefaultMetric(la.getTeMetric().getValue());
276             }
277             if (la.getUnreservedBandwidth() != null) {
278                 tb.setUnreservedBandwidth(unreservedBandwidthList(la.nonnullUnreservedBandwidth().values()));
279             }
280             if (la.getMaxLinkBandwidth() != null) {
281                 tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth()));
282             }
283             if (la.getMaxReservableBandwidth() != null) {
284                 tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth()));
285             }
286             if (la.getSharedRiskLinkGroups() != null) {
287                 final List<SrlgValues> srlgs = new ArrayList<>();
288                 for (final SrlgId id : la.getSharedRiskLinkGroups()) {
289                     srlgs.add(new SrlgValuesBuilder().setSrlgValue(id.getValue()).build());
290                 }
291                 tb.setSrlg(new SrlgBuilder().setSrlgValues(srlgs).build());
292             }
293         }
294
295         final IsisLinkAttributesBuilder ilab = new IsisLinkAttributesBuilder();
296         ilab.setTed(tb.build());
297         if (topologyIdentifier != null) {
298             ilab.setMultiTopologyId(Uint8.valueOf(topologyIdentifier.getValue()));
299         }
300
301         return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021
302                 .IgpLinkAttributes1Builder().setIsisLinkAttributes(ilab.build()).build();
303     }
304
305     private static Float bandwidthToFloat(final Bandwidth bandwidth) {
306         return ByteBuffer.wrap(bandwidth.getValue()).getFloat();
307     }
308
309     private static BigDecimal bandwidthToBigDecimal(final Bandwidth bandwidth) {
310         return BigDecimal.valueOf(bandwidthToFloat(bandwidth));
311     }
312
313     private static List<UnreservedBandwidth> unreservedBandwidthList(
314             final Collection<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang
315                 .bgp.linkstate.rev200120.UnreservedBandwidth> input) {
316         final List<UnreservedBandwidth> ret = new ArrayList<>(input.size());
317
318         for (final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120
319                 .UnreservedBandwidth bandwidth : input) {
320             ret.add(new UnreservedBandwidthBuilder().setBandwidth(bandwidthToBigDecimal(bandwidth.getBandwidth()))
321                     .withKey(new UnreservedBandwidthKey(bandwidth.getPriority())).build());
322         }
323
324         return ret;
325     }
326 }