2 * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
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
8 package org.opendaylight.bgpcep.bgp.topology.provider;
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 import org.opendaylight.yangtools.yang.common.Uint8;
61 public final class ProtocolUtil {
62 private ProtocolUtil() {
66 public static void augmentProtocolId(final LinkstateRoute value, final PrefixAttributes pa,
67 final PrefixBuilder pb) {
68 switch (value.getProtocolId()) {
74 if (pa != null && pa.getOspfForwardingAddress() != null) {
75 pb.addAugmentation(Prefix1.class, new Prefix1Builder().setOspfPrefixAttributes(
76 new OspfPrefixAttributesBuilder().setForwardingAddress(pa.getOspfForwardingAddress()
77 .getIpv4AddressNoZone()).build()).build());
85 public static void augmentProtocolId(final LinkstateRoute value, final IgpNodeAttributesBuilder inab,
86 final NodeAttributes na, final NodeIdentifier nd) {
87 switch (value.getProtocolId()) {
93 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021
94 .IgpNodeAttributes1.class, isisNodeAttributes(nd, na));
97 inab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021
98 .IgpNodeAttributes1.class, ospfNodeAttributes(nd, na));
105 public static void augmentProtocolId(final LinkstateRoute value, final IgpLinkAttributesBuilder ilab,
106 final LinkAttributes la, final LinkDescriptors ld) {
107 switch (value.getProtocolId()) {
112 ilab.addAugmentation(
113 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021
114 .IgpLinkAttributes1.class, isisLinkAttributes(ld.getMultiTopologyId(), la));
118 ilab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021
119 .IgpLinkAttributes1.class, ospfLinkAttributes(ld.getMultiTopologyId(), la));
126 private static org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021
127 .IgpNodeAttributes1 isisNodeAttributes(final NodeIdentifier node, final NodeAttributes na) {
128 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node
129 .attributes.isis.node.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml
130 .ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.TedBuilder();
131 final IsisNodeAttributesBuilder ab = new IsisNodeAttributesBuilder();
134 if (na.getIpv4RouterId() != null) {
135 tb.setTeRouterIdIpv4(na.getIpv4RouterId());
137 if (na.getIpv6RouterId() != null) {
138 tb.setTeRouterIdIpv6(na.getIpv6RouterId());
140 if (na.getTopologyIdentifier() != null) {
141 ab.setMultiTopologyId(nodeMultiTopology(na.getTopologyIdentifier()));
145 final CRouterIdentifier ri = node.getCRouterIdentifier();
146 if (ri instanceof IsisPseudonodeCase) {
147 final IsisPseudonode pn = ((IsisPseudonodeCase) ri).getIsisPseudonode();
148 final IsoBuilder b = new IsoBuilder();
149 final String systemId = UriBuilder.isoId(pn.getIsIsRouterIdentifier().getIsoSystemId());
150 b.setIsoSystemId(new IsoSystemId(systemId));
151 b.setIsoPseudonodeId(new IsoPseudonodeId(BaseEncoding.base16()
152 .encode(new byte[]{pn.getPsn().byteValue()})));
153 ab.setIso(b.build());
155 ab.setNet(toIsoNetIds(na.getIsisAreaId(), systemId));
157 } else if (ri instanceof IsisNodeCase) {
158 final IsisNode in = ((IsisNodeCase) ri).getIsisNode();
159 final String systemId = UriBuilder.isoId(in.getIsoSystemId());
160 ab.setIso(new IsoBuilder().setIsoSystemId(new IsoSystemId(systemId)).build());
162 ab.setNet(toIsoNetIds(na.getIsisAreaId(), systemId));
166 ab.setTed(tb.build());
168 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021
169 .IgpNodeAttributes1Builder().setIsisNodeAttributes(ab.build()).build();
172 private static org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021
173 .IgpNodeAttributes1 ospfNodeAttributes(
174 final NodeIdentifier node, final NodeAttributes na) {
175 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node
176 .attributes.ospf.node.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd
177 .params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder();
178 final OspfNodeAttributesBuilder ab = new OspfNodeAttributesBuilder();
180 if (na.getIpv4RouterId() != null) {
181 tb.setTeRouterIdIpv4(na.getIpv4RouterId());
183 if (na.getIpv6RouterId() != null) {
184 tb.setTeRouterIdIpv6(na.getIpv6RouterId());
186 if (na.getTopologyIdentifier() != null) {
187 ab.setMultiTopologyId(nodeMultiTopology(na.getTopologyIdentifier()));
189 final CRouterIdentifier ri = node.getCRouterIdentifier();
190 if (ri instanceof OspfPseudonodeCase) {
191 final OspfPseudonode pn = ((OspfPseudonodeCase) ri).getOspfPseudonode();
193 ab.setRouterType(new PseudonodeBuilder().setPseudonode(Empty.getInstance()).build());
194 ab.setDrInterfaceId(pn.getLanInterface().getValue());
195 } else if (ri instanceof OspfNodeCase && na.getNodeFlags() != null) {
196 // TODO: what should we do with in.getOspfRouterId()?
198 final NodeFlagBits nf = na.getNodeFlags();
199 if (nf.isAbr() != null) {
200 ab.setRouterType(new AbrBuilder().setAbr(nf.isAbr() ? Empty.getInstance() : null).build());
201 } else if (nf.isExternal() != null) {
202 ab.setRouterType(new InternalBuilder().setInternal(nf.isExternal() ? null : Empty.getInstance())
207 ab.setTed(tb.build());
208 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021
209 .IgpNodeAttributes1Builder().setOspfNodeAttributes(ab.build()).build();
213 private static List<IsoNetId> toIsoNetIds(final List<IsisAreaIdentifier> areaIds, final String systemId) {
214 return areaIds.stream().map(input -> new IsoNetId(UriBuilder.toIsoNetId(input, systemId)))
215 .collect(Collectors.toList());
218 private static List<Uint8> nodeMultiTopology(final List<TopologyIdentifier> list) {
219 final List<Uint8> ret = new ArrayList<>(list.size());
220 for (final TopologyIdentifier id : list) {
221 ret.add(Uint8.valueOf(id.getValue()));
226 private static org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021
227 .IgpLinkAttributes1 ospfLinkAttributes(final TopologyIdentifier topologyIdentifier,
228 final LinkAttributes la) {
229 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes
230 .ospf.link.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
231 .ospf.topology.rev131021.ospf.link.attributes.ospf.link.attributes.TedBuilder();
234 if (la.getAdminGroup() != null) {
235 tb.setColor(la.getAdminGroup().getValue());
237 if (la.getTeMetric() != null) {
238 tb.setTeDefaultMetric(la.getTeMetric().getValue());
240 if (la.getUnreservedBandwidth() != null) {
241 tb.setUnreservedBandwidth(unreservedBandwidthList(la.getUnreservedBandwidth()));
243 if (la.getMaxLinkBandwidth() != null) {
244 tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth()));
246 if (la.getMaxReservableBandwidth() != null) {
247 tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth()));
249 if (la.getSharedRiskLinkGroups() != null) {
250 final List<SrlgValues> srlgs = new ArrayList<>();
251 for (final SrlgId id : la.getSharedRiskLinkGroups()) {
252 srlgs.add(new SrlgValuesBuilder().setSrlgValue(id.getValue()).build());
254 tb.setSrlg(new SrlgBuilder().setSrlgValues(srlgs).build());
258 final OspfLinkAttributesBuilder ilab = new OspfLinkAttributesBuilder();
259 ilab.setTed(tb.build());
260 if (topologyIdentifier != null) {
261 ilab.setMultiTopologyId(Uint8.valueOf(topologyIdentifier.getValue()));
264 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021
265 .IgpLinkAttributes1Builder().setOspfLinkAttributes(ilab.build()).build();
269 private static org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021
270 .IgpLinkAttributes1 isisLinkAttributes(
271 final TopologyIdentifier topologyIdentifier, final LinkAttributes la) {
272 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis
273 .link.attributes.isis.link.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params
274 .xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder();
277 if (la.getAdminGroup() != null) {
278 tb.setColor(la.getAdminGroup().getValue());
280 if (la.getTeMetric() != null) {
281 tb.setTeDefaultMetric(la.getTeMetric().getValue());
283 if (la.getUnreservedBandwidth() != null) {
284 tb.setUnreservedBandwidth(unreservedBandwidthList(la.getUnreservedBandwidth()));
286 if (la.getMaxLinkBandwidth() != null) {
287 tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth()));
289 if (la.getMaxReservableBandwidth() != null) {
290 tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth()));
292 if (la.getSharedRiskLinkGroups() != null) {
293 final List<SrlgValues> srlgs = new ArrayList<>();
294 for (final SrlgId id : la.getSharedRiskLinkGroups()) {
295 srlgs.add(new SrlgValuesBuilder().setSrlgValue(id.getValue()).build());
297 tb.setSrlg(new SrlgBuilder().setSrlgValues(srlgs).build());
301 final IsisLinkAttributesBuilder ilab = new IsisLinkAttributesBuilder();
302 ilab.setTed(tb.build());
303 if (topologyIdentifier != null) {
304 ilab.setMultiTopologyId(Uint8.valueOf(topologyIdentifier.getValue()));
307 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021
308 .IgpLinkAttributes1Builder().setIsisLinkAttributes(ilab.build()).build();
311 private static Float bandwidthToFloat(final Bandwidth bandwidth) {
312 return ByteBuffer.wrap(bandwidth.getValue()).getFloat();
315 private static BigDecimal bandwidthToBigDecimal(final Bandwidth bandwidth) {
316 return BigDecimal.valueOf(bandwidthToFloat(bandwidth));
319 private static List<UnreservedBandwidth> unreservedBandwidthList(
320 final List<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate
321 .rev180329.UnreservedBandwidth> input) {
322 final List<UnreservedBandwidth> ret = new ArrayList<>(input.size());
324 for (final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329
325 .UnreservedBandwidth bandwidth : input) {
326 ret.add(new UnreservedBandwidthBuilder().setBandwidth(bandwidthToBigDecimal(bandwidth.getBandwidth()))
327 .withKey(new UnreservedBandwidthKey(bandwidth.getPriority())).build());