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