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