Merge "Add SimpleBGPExtensionProviderContextModuleTest."
[bgpcep.git] / bgp / topology-provider / src / main / java / org / opendaylight / bgpcep / bgp / topology / provider / LinkstateTopologyBuilder.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  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 java.math.BigDecimal;
11 import java.nio.ByteBuffer;
12 import java.util.ArrayList;
13 import java.util.List;
14
15 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
16 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
17 import org.opendaylight.protocol.bgp.rib.RibReference;
18 import org.opendaylight.protocol.util.ByteArray;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.DomainName;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.Ipv4InterfaceIdentifier;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.Ipv6InterfaceIdentifier;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.NodeFlagBits;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.NodeIdentifier;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.TopologyIdentifier;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.LinkstateRoute;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.Attributes1;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.ObjectType;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.link._case.LinkAttributes;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.node._case.NodeAttributes;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.prefix._case.PrefixAttributes;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.object.type.LinkCase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.object.type.NodeCase;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.object.type.PrefixCase;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.object.type.link._case.LinkDescriptors;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.object.type.node._case.NodeDescriptors;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.CRouterIdentifier;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.IsisNodeCase;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.IsisPseudonodeCase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.OspfNodeCase;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.OspfPseudonodeCase;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.isis.node._case.IsisNode;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.isis.pseudonode._case.IsisPseudonode;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.ospf.node._case.OspfNode;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.ospf.pseudonode._case.OspfPseudonode;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.route.Attributes;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.Bandwidth;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IsoPseudonodeId;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IsoSystemId;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.IsisLinkAttributesBuilder;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.IsisNodeAttributesBuilder;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.IsoBuilder;
53 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.ted.rev131021.ted.link.attributes.UnreservedBandwidth;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.ted.rev131021.ted.link.attributes.UnreservedBandwidthBuilder;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.ted.rev131021.ted.link.attributes.UnreservedBandwidthKey;
56 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.LinkId;
57 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
58 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
59 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
60 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.DestinationBuilder;
61 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.SourceBuilder;
62 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.LinkBuilder;
63 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.LinkKey;
64 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
65 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
66 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.TopologyTypesBuilder;
67 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
68 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
69 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
70 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Link1;
71 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Link1Builder;
72 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Node1;
73 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Node1Builder;
74 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.TerminationPoint1;
75 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.TerminationPoint1Builder;
76 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.TopologyTypes1;
77 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.TopologyTypes1Builder;
78 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.link.attributes.IgpLinkAttributesBuilder;
79 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributesBuilder;
80 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;
81 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.igp.node.attributes.PrefixKey;
82 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.termination.point.attributes.IgpTerminationPointAttributesBuilder;
83 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.termination.point.attributes.igp.termination.point.attributes.TerminationPointType;
84 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.termination.point.attributes.igp.termination.point.attributes.termination.point.type.IpBuilder;
85 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.termination.point.attributes.igp.termination.point.attributes.termination.point.type.UnnumberedBuilder;
86 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.Prefix1;
87 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.Prefix1Builder;
88 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.OspfLinkAttributesBuilder;
89 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.OspfNodeAttributesBuilder;
90 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.router.type.AbrBuilder;
91 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.router.type.InternalBuilder;
92 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.router.type.PseudonodeBuilder;
93 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.prefix.attributes.OspfPrefixAttributesBuilder;
94 import org.opendaylight.yangtools.yang.binding.DataObject;
95 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
96 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
97 import org.slf4j.Logger;
98 import org.slf4j.LoggerFactory;
99
100 import com.google.common.collect.Lists;
101 import com.google.common.primitives.UnsignedInteger;
102
103 public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder<LinkstateRoute> {
104         private static final Logger LOG = LoggerFactory.getLogger(LinkstateTopologyBuilder.class);
105
106         public LinkstateTopologyBuilder(final DataProviderService dataProvider, final RibReference locRibReference, final TopologyId topologyId) {
107                 super(dataProvider, locRibReference, topologyId, new TopologyTypesBuilder().addAugmentation(TopologyTypes1.class,
108                                 new TopologyTypes1Builder().build()).build(), LinkstateRoute.class);
109         }
110
111         private LinkId buildLinkId(final UriBuilder base, final LinkCase link) {
112                 return new LinkId(new UriBuilder(base, "link").add(link).toString());
113         }
114
115         private NodeId buildNodeId(final UriBuilder base, final NodeIdentifier node) {
116                 return new NodeId(new UriBuilder(base, "node").add("", node).toString());
117         }
118
119         private TpId buildTpId(final UriBuilder base, final TopologyIdentifier topologyIdentifier,
120                         final Ipv4InterfaceIdentifier ipv4InterfaceIdentifier, final Ipv6InterfaceIdentifier ipv6InterfaceIdentifier, final byte[] bs) {
121                 return new TpId(new UriBuilder(base, "tp").add("mt", topologyIdentifier).add("ipv4", ipv4InterfaceIdentifier).add("ipv6",
122                                 ipv6InterfaceIdentifier).add("id", bs).toString());
123         }
124
125         private TpId buildLocalTpId(final UriBuilder base, final LinkDescriptors linkDescriptors) {
126                 return buildTpId(base, linkDescriptors.getMultiTopologyId(), linkDescriptors.getIpv4InterfaceAddress(),
127                                 linkDescriptors.getIpv6InterfaceAddress(), linkDescriptors.getLinkLocalIdentifier());
128         }
129
130         private TerminationPoint buildTp(final TpId id, final TerminationPointType type) {
131                 final TerminationPointBuilder stpb = new TerminationPointBuilder();
132                 stpb.setKey(new TerminationPointKey(id));
133                 stpb.setTpId(id);
134
135                 if (type != null) {
136                         stpb.addAugmentation(
137                                         TerminationPoint1.class,
138                                         new TerminationPoint1Builder().setIgpTerminationPointAttributes(
139                                                         new IgpTerminationPointAttributesBuilder().setTerminationPointType(null).build()).build());
140                 }
141
142                 return stpb.build();
143         }
144
145         private TerminationPointType getTpType(final Ipv4InterfaceIdentifier ipv4InterfaceIdentifier,
146                         final Ipv6InterfaceIdentifier ipv6InterfaceIdentifier, final byte[] bs) {
147                 // Order of preference: Unnumbered first, then IP
148                 if (bs != null) {
149                         final long id = UnsignedInteger.fromIntBits(ByteArray.bytesToInt(bs)).longValue();
150                         LOG.debug("Unnumbered termination point type: {}", id);
151                         return new UnnumberedBuilder().setUnnumberedId(id).build();
152                 }
153
154                 final IpAddress ip;
155                 if (ipv6InterfaceIdentifier != null) {
156                         ip = new IpAddress(ipv6InterfaceIdentifier);
157                 } else if (ipv4InterfaceIdentifier != null) {
158                         ip = new IpAddress(ipv4InterfaceIdentifier);
159                 } else {
160                         ip = null;
161                 }
162
163                 if (ip != null) {
164                         LOG.debug("IP termination point type: {}", ip);
165                         return new IpBuilder().setIpAddress(Lists.newArrayList(ip)).build();
166                 }
167
168                 return null;
169         }
170
171         private TerminationPoint buildLocalTp(final UriBuilder base, final LinkDescriptors linkDescriptors) {
172                 final TpId id = buildLocalTpId(base, linkDescriptors);
173                 final TerminationPointType t = getTpType(linkDescriptors.getIpv4InterfaceAddress(), linkDescriptors.getIpv6InterfaceAddress(),
174                                 linkDescriptors.getLinkLocalIdentifier());
175
176                 return buildTp(id, t);
177         }
178
179         private TpId buildRemoteTpId(final UriBuilder base, final LinkDescriptors linkDescriptors) {
180                 return buildTpId(base, linkDescriptors.getMultiTopologyId(), linkDescriptors.getIpv4NeighborAddress(),
181                                 linkDescriptors.getIpv6NeighborAddress(), linkDescriptors.getLinkRemoteIdentifier());
182         }
183
184         private TerminationPoint buildRemoteTp(final UriBuilder base, final LinkDescriptors linkDescriptors) {
185                 final TpId id = buildRemoteTpId(base, linkDescriptors);
186                 final TerminationPointType t = getTpType(linkDescriptors.getIpv4NeighborAddress(), linkDescriptors.getIpv6NeighborAddress(),
187                                 linkDescriptors.getLinkRemoteIdentifier());
188
189                 return buildTp(id, t);
190         }
191
192         private InstanceIdentifier<?> buildLinkIdentifier(final UriBuilder base, final LinkCase l) {
193                 return InstanceIdentifier.builder(getInstanceIdentifier()).child(
194                                 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link.class,
195                                 new LinkKey(buildLinkId(base, l))).toInstance();
196         }
197
198         private static Float bandwidthToFloat(final Bandwidth bandwidth) {
199                 return ByteBuffer.wrap(bandwidth.getValue()).getFloat();
200         }
201
202         private static BigDecimal bandwidthToBigDecimal(final Bandwidth bandwidth) {
203                 return BigDecimal.valueOf(bandwidthToFloat(bandwidth));
204         }
205
206         private static List<UnreservedBandwidth> unreservedBandwidthList(
207                         final List<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.UnreservedBandwidth> input) {
208                 final List<UnreservedBandwidth> ret = new ArrayList<>(input.size());
209
210                 for (final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.UnreservedBandwidth i : input) {
211                         ret.add(new UnreservedBandwidthBuilder().setBandwidth(bandwidthToBigDecimal(i.getBandwidth())).setKey(
212                                         new UnreservedBandwidthKey(i.getPriority())).build());
213                 }
214
215                 return ret;
216         }
217
218         private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1 isisLinkAttributes(
219                         final TopologyIdentifier topologyIdentifier, final LinkAttributes la) {
220                 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder();
221
222                 if (la != null) {
223                         if (la.getAdminGroup() != null) {
224                                 tb.setColor(la.getAdminGroup().getValue());
225                         }
226                         if (la.getTeMetric() != null) {
227                                 tb.setTeDefaultMetric(la.getTeMetric().getValue());
228                         }
229                         if (la.getUnreservedBandwidth() != null) {
230                                 tb.setUnreservedBandwidth(unreservedBandwidthList(la.getUnreservedBandwidth()));
231                         }
232                         if (la.getMaxLinkBandwidth() != null) {
233                                 tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth()));
234                         }
235                         if (la.getMaxReservableBandwidth() != null) {
236                                 tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth()));
237                         }
238                 }
239
240                 final IsisLinkAttributesBuilder ilab = new IsisLinkAttributesBuilder();
241                 ilab.setTed(tb.build());
242                 if (topologyIdentifier != null) {
243                         ilab.setMultiTopologyId(topologyIdentifier.getValue().shortValue());
244                 }
245
246                 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1Builder().setIsisLinkAttributes(
247                                 ilab.build()).build();
248         }
249
250         private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1 ospfLinkAttributes(
251                         final TopologyIdentifier topologyIdentifier, final LinkAttributes la) {
252                 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.ospf.link.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.ospf.link.attributes.TedBuilder();
253
254                 if (la != null) {
255                         if (la.getAdminGroup() != null) {
256                                 tb.setColor(la.getAdminGroup().getValue());
257                         }
258                         if (la.getTeMetric() != null) {
259                                 tb.setTeDefaultMetric(la.getTeMetric().getValue());
260                         }
261                         if (la.getUnreservedBandwidth() != null) {
262                                 tb.setUnreservedBandwidth(unreservedBandwidthList(la.getUnreservedBandwidth()));
263                         }
264                         if (la.getMaxLinkBandwidth() != null) {
265                                 tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth()));
266                         }
267                         if (la.getMaxReservableBandwidth() != null) {
268                                 tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth()));
269                         }
270                 }
271
272                 final OspfLinkAttributesBuilder ilab = new OspfLinkAttributesBuilder();
273                 ilab.setTed(tb.build());
274                 if (topologyIdentifier != null) {
275                         ilab.setMultiTopologyId(topologyIdentifier.getValue().shortValue());
276                 }
277
278                 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1Builder().setOspfLinkAttributes(
279                                 ilab.build()).build();
280         }
281
282         private void createLink(final DataModification<InstanceIdentifier<?>, DataObject> trans, final UriBuilder base,
283                         final LinkstateRoute value, final LinkCase l, final Attributes attributes) {
284                 final LinkAttributes la = ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.LinkCase) attributes.getAugmentation(
285                                 Attributes1.class).getAttributeType()).getLinkAttributes();
286
287                 final IgpLinkAttributesBuilder ilab = new IgpLinkAttributesBuilder();
288                 if (la != null) {
289                         ilab.setMetric(la.getMetric().getValue());
290                         ilab.setName(la.getLinkName());
291                 }
292
293                 switch (value.getProtocolId()) {
294                 case Direct:
295                 case Static:
296                 case Unknown:
297                         break;
298                 case IsisLevel1:
299                 case IsisLevel2:
300                         ilab.addAugmentation(
301                                         org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1.class,
302                                         isisLinkAttributes(l.getLinkDescriptors().getMultiTopologyId(), la));
303                         break;
304                 case Ospf:
305                         ilab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1.class,
306                                         ospfLinkAttributes(l.getLinkDescriptors().getMultiTopologyId(), la));
307                         break;
308                 }
309
310                 final LinkBuilder lb = new LinkBuilder();
311                 lb.setLinkId(buildLinkId(base, l));
312                 lb.addAugmentation(Link1.class, new Link1Builder().setIgpLinkAttributes(ilab.build()).build());
313
314                 final NodeId srcNode = buildNodeId(base, l.getLocalNodeDescriptors());
315                 final NodeId dstNode = buildNodeId(base, l.getRemoteNodeDescriptors());
316                 final TerminationPoint srcTp = buildLocalTp(base, l.getLinkDescriptors());
317                 final TerminationPoint dstTp = buildRemoteTp(base, l.getLinkDescriptors());
318
319                 lb.setSource(new SourceBuilder().setSourceNode(srcNode).setSourceTp(srcTp.getTpId()).build());
320                 lb.setDestination(new DestinationBuilder().setDestNode(dstNode).setDestTp(dstTp.getTpId()).build());
321
322                 trans.putOperationalData(buildTpIdentifier(srcNode, srcTp.getKey()), srcTp);
323                 trans.putOperationalData(buildTpIdentifier(dstNode, dstTp.getKey()), dstTp);
324                 trans.putOperationalData(buildLinkIdentifier(base, l), lb.build());
325                 LOG.debug("Created link {}", l);
326         }
327
328         private void removeLink(final DataModification<InstanceIdentifier<?>, DataObject> trans, final UriBuilder base, final LinkCase l) {
329                 trans.removeOperationalData(buildLinkIdentifier(base, l));
330         }
331
332         private InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node> nodeIdentifierBuilder(
333                         final UriBuilder base, final NodeIdentifier node) {
334                 return InstanceIdentifier.builder(getInstanceIdentifier()).child(
335                                 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class,
336                                 new NodeKey(buildNodeId(base, node)));
337         }
338
339         private InstanceIdentifier<TerminationPoint> buildTpIdentifier(final NodeId node, final TerminationPointKey key) {
340                 return InstanceIdentifier.builder(getInstanceIdentifier()).child(
341                                 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class,
342                                 new NodeKey(node)).child(TerminationPoint.class, key).build();
343         }
344
345         private List<Short> nodeMultiTopology(final List<TopologyIdentifier> list) {
346                 final List<Short> ret = new ArrayList<>(list.size());
347                 for (final TopologyIdentifier id : list) {
348                         ret.add(id.getValue().shortValue());
349                 }
350                 return ret;
351         }
352
353         private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1 isisNodeAttributes(
354                         final NodeIdentifier node, final NodeAttributes na) {
355                 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.TedBuilder();
356                 final IsisNodeAttributesBuilder ab = new IsisNodeAttributesBuilder();
357
358                 if (na != null) {
359                         if (na.getIpv4RouterId() != null) {
360                                 tb.setTeRouterIdIpv4(na.getIpv4RouterId());
361                         }
362                         if (na.getIpv6RouterId() != null) {
363                                 tb.setTeRouterIdIpv6(na.getIpv6RouterId());
364                         }
365                         if (na.getTopologyIdentifier() != null) {
366                                 ab.setMultiTopologyId(nodeMultiTopology(na.getTopologyIdentifier()));
367                         }
368                 }
369
370                 final CRouterIdentifier ri = node.getCRouterIdentifier();
371                 if (ri instanceof IsisPseudonodeCase) {
372                         final IsisPseudonode pn = ((IsisPseudonodeCase) ri).getIsisPseudonode();
373                         ab.setIso(new IsoBuilder().setIsoPseudonodeId(new IsoPseudonodeId(pn.toString())).build());
374                 } else if (ri instanceof IsisNodeCase) {
375                         final IsisNode in = ((IsisNodeCase) ri).getIsisNode();
376                         ab.setIso(new IsoBuilder().setIsoSystemId(new IsoSystemId(in.getIsoSystemId().toString())).build());
377                 }
378
379                 ab.setTed(tb.build());
380
381                 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1Builder().setIsisNodeAttributes(
382                                 ab.build()).build();
383         }
384
385         private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1 ospfNodeAttributes(
386                         final NodeDescriptors node, final NodeAttributes na) {
387                 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder();
388                 final OspfNodeAttributesBuilder ab = new OspfNodeAttributesBuilder();
389
390                 if (na != null) {
391                         if (na.getIpv4RouterId() != null) {
392                                 tb.setTeRouterIdIpv4(na.getIpv4RouterId());
393                         }
394                         if (na.getIpv6RouterId() != null) {
395                                 tb.setTeRouterIdIpv6(na.getIpv6RouterId());
396                         }
397                         if (na.getTopologyIdentifier() != null) {
398                                 ab.setMultiTopologyId(nodeMultiTopology(na.getTopologyIdentifier()));
399                         }
400                 }
401
402                 final CRouterIdentifier ri = node.getCRouterIdentifier();
403                 if (ri instanceof OspfPseudonodeCase) {
404                         final OspfPseudonode pn = ((OspfPseudonodeCase) ri).getOspfPseudonode();
405
406                         ab.setRouterType(new PseudonodeBuilder().setPseudonode(Boolean.TRUE).build());
407                         ab.setDrInterfaceId(UnsignedInteger.fromIntBits(ByteArray.bytesToInt(pn.getLanInterface().getValue())).longValue());
408                 } else if (ri instanceof OspfNodeCase) {
409                         final OspfNode in = ((OspfNodeCase) ri).getOspfNode();
410
411                         // TODO: what should we do with in.getOspfRouterId()?
412
413                         if (na != null) {
414                                 final NodeFlagBits nf = na.getNodeFlags();
415                                 if (nf != null) {
416                                         if (nf.isAbr()) {
417                                                 ab.setRouterType(new AbrBuilder().setAbr(Boolean.TRUE).build());
418                                         } else if (!nf.isExternal()) {
419                                                 ab.setRouterType(new InternalBuilder().setInternal(Boolean.TRUE).build());
420                                         }
421                                 }
422                         }
423                 }
424
425                 ab.setTed(tb.build());
426
427                 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1Builder().setOspfNodeAttributes(
428                                 ab.build()).build();
429         }
430
431         private void createNode(final DataModification<InstanceIdentifier<?>, DataObject> trans, final UriBuilder base,
432                         final LinkstateRoute value, final NodeCase n, final Attributes attributes) {
433                 final NodeAttributes na = ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.NodeCase) attributes.getAugmentation(
434                                 Attributes1.class).getAttributeType()).getNodeAttributes();
435                 final IgpNodeAttributesBuilder inab = new IgpNodeAttributesBuilder();
436
437                 final List<IpAddress> ids = new ArrayList<>();
438                 if (na != null) {
439                         if (na.getIpv4RouterId() != null) {
440                                 ids.add(new IpAddress(na.getIpv4RouterId()));
441                         }
442                         if (na.getIpv6RouterId() != null) {
443                                 ids.add(new IpAddress(na.getIpv6RouterId()));
444                         }
445                         if (na.getDynamicHostname() != null) {
446                                 inab.setName(new DomainName(na.getDynamicHostname()));
447                         }
448                 }
449
450                 if (!ids.isEmpty()) {
451                         inab.setRouterId(ids);
452                 }
453
454                 switch (value.getProtocolId()) {
455                 case Direct:
456                 case Static:
457                 case Unknown:
458                         break;
459                 case IsisLevel1:
460                 case IsisLevel2:
461                         inab.addAugmentation(
462                                         org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1.class,
463                                         isisNodeAttributes(n.getNodeDescriptors(), na));
464                         break;
465                 case Ospf:
466                         inab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1.class,
467                                         ospfNodeAttributes(n.getNodeDescriptors(), na));
468                         break;
469                 }
470
471                 final NodeBuilder nb = new NodeBuilder();
472                 nb.setNodeId(buildNodeId(base, n.getNodeDescriptors()));
473                 nb.addAugmentation(Node1.class, new Node1Builder().setIgpNodeAttributes(inab.build()).build());
474
475                 trans.putOperationalData(nodeIdentifierBuilder(base, n.getNodeDescriptors()).toInstance(), nb.build());
476                 LOG.debug("Created node {}", n);
477         }
478
479         private void removeNode(final DataModification<InstanceIdentifier<?>, DataObject> trans, final UriBuilder base, final NodeCase n) {
480                 trans.removeOperationalData(nodeIdentifierBuilder(base, n.getNodeDescriptors()).toInstance());
481         }
482
483         private InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.igp.node.attributes.Prefix> prefixIdentifier(
484                         final UriBuilder base, final PrefixCase p) {
485                 return nodeIdentifierBuilder(base, p.getAdvertisingNodeDescriptors()).augmentation(Node1.class).child(
486                                 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributes.class).child(
487                                                 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.igp.node.attributes.Prefix.class,
488                                                 new PrefixKey(p.getIpReachabilityInformation())).toInstance();
489         }
490
491         private void createPrefix(final DataModification<InstanceIdentifier<?>, DataObject> trans, final UriBuilder base,
492                         final LinkstateRoute value, final PrefixCase p, final Attributes attributes) {
493                 final PrefixAttributes pa = ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.PrefixCase) attributes.getAugmentation(
494                                 Attributes1.class).getAttributeType()).getPrefixAttributes();
495
496                 final PrefixBuilder pb = new PrefixBuilder();
497                 pb.setPrefix(p.getIpReachabilityInformation());
498                 if (pa != null) {
499                         pb.setMetric(pa.getPrefixMetric().getValue());
500                 }
501
502                 switch (value.getProtocolId()) {
503                 case Direct:
504                 case IsisLevel1:
505                 case IsisLevel2:
506                 case Static:
507                 case Unknown:
508                         break;
509                 case Ospf:
510                         if (pa != null) {
511                                 pb.addAugmentation(
512                                                 Prefix1.class,
513                                                 new Prefix1Builder().setOspfPrefixAttributes(
514                                                                 new OspfPrefixAttributesBuilder().setForwardingAddress(pa.getOspfForwardingAddress()).build()).build());
515                         }
516                         break;
517                 }
518
519                 trans.putOperationalData(prefixIdentifier(base, p), pb.build());
520                 LOG.debug("Created prefix {}", p);
521         }
522
523         private void removePrefix(final DataModification<InstanceIdentifier<?>, DataObject> trans, final UriBuilder base, final PrefixCase p) {
524                 trans.removeOperationalData(prefixIdentifier(base, p));
525         }
526
527         @Override
528         protected void createObject(final DataModification<InstanceIdentifier<?>, DataObject> trans,
529                         final InstanceIdentifier<LinkstateRoute> id, final LinkstateRoute value) {
530                 final UriBuilder base = new UriBuilder(value);
531
532                 final ObjectType t = value.getObjectType();
533                 if (t instanceof LinkCase) {
534                         createLink(trans, base, value, (LinkCase) t, value.getAttributes());
535                 } else if (t instanceof NodeCase) {
536                         createNode(trans, base, value, (NodeCase) t, value.getAttributes());
537                 } else if (t instanceof PrefixCase) {
538                         createPrefix(trans, base, value, (PrefixCase) t, value.getAttributes());
539                 } else {
540                         throw new IllegalStateException("Unhandled object class " + t.getImplementedInterface());
541                 }
542         }
543
544         @Override
545         protected void removeObject(final DataModification<InstanceIdentifier<?>, DataObject> trans,
546                         final InstanceIdentifier<LinkstateRoute> id, final LinkstateRoute value) {
547                 final UriBuilder base = new UriBuilder(value);
548
549                 final ObjectType t = value.getObjectType();
550                 if (t instanceof LinkCase) {
551                         removeLink(trans, base, (LinkCase) t);
552                 } else if (t instanceof NodeCase) {
553                         removeNode(trans, base, (NodeCase) t);
554                 } else if (t instanceof PrefixCase) {
555                         removePrefix(trans, base, (PrefixCase) t);
556                 } else {
557                         throw new IllegalStateException("Unhandled object class " + t.getImplementedInterface());
558                 }
559         }
560 }