2 * Copyright (c) 2014 Cisco Systems, Inc. and others. 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.protocol.bgp.linkstate;
10 import static org.junit.Assert.assertEquals;
12 import com.google.common.collect.Lists;
13 import java.math.BigInteger;
14 import java.util.ArrayList;
15 import java.util.List;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.mockito.Matchers;
19 import org.mockito.Mock;
20 import org.mockito.Mockito;
21 import org.mockito.MockitoAnnotations;
22 import org.mockito.invocation.InvocationOnMock;
23 import org.mockito.stubbing.Answer;
24 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
25 import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTest;
26 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
27 import org.opendaylight.protocol.bgp.rib.RibReference;
28 import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsTransaction;
29 import org.opendaylight.protocol.bgp.rib.spi.BGPObjectComparator;
30 import org.opendaylight.protocol.bgp.rib.spi.Peer;
31 import org.opendaylight.protocol.bgp.rib.spi.RouteEncoder;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.Identifier;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.Ipv4InterfaceIdentifier;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.NlriType;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.ProtocolId;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.isis.lan.identifier.IsIsRouterIdentifierBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.destination.CLinkstateDestination;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.destination.CLinkstateDestinationBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.destination.c.linkstate.destination.LinkDescriptorsBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.destination.c.linkstate.destination.LocalNodeDescriptorsBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.destination.c.linkstate.destination.PrefixDescriptorsBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.destination.c.linkstate.destination.RemoteNodeDescriptorsBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.routes.linkstate.routes.LinkstateRoute;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.routes.linkstate.routes.LinkstateRouteBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.routes.linkstate.routes.linkstate.route.object.type.LinkCaseBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.routes.linkstate.routes.linkstate.route.object.type.NodeCaseBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.routes.linkstate.routes.linkstate.route.object.type.PrefixCaseBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.routes.linkstate.routes.linkstate.route.object.type.node._case.NodeDescriptorsBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.routes.linkstate.routes.linkstate.route.object.type.prefix._case.AdvertisingNodeDescriptorsBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.IsisPseudonodeCaseBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.isis.pseudonode._case.IsisPseudonodeBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationLinkstateCase;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationLinkstateCaseBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.reach.nlri.advertized.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.OriginBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpReachNlriBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlriBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Route;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.LocRib;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Attributes;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.AttributesBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpOrigin;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
79 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
80 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
82 public class LinkstateAdjRIBsInTest extends AbstractDataBrokerTest {
84 private static final AsNumber TEST_AS_NUMBER = new AsNumber(35L);
87 private RibReference rib;
93 private AdjRIBsTransaction adjRibTx;
96 private RouteEncoder encoder;
98 private LinkstateAdjRIBsIn lrib;
100 private CLinkstateDestinationBuilder dBuilder;
102 private final MpReachNlriBuilder builder = new MpReachNlriBuilder();
104 private final List<CLinkstateDestination> destinations = new ArrayList<>();
106 private final BGPObjectComparator bgpComparator = new BGPObjectComparator(TEST_AS_NUMBER);
109 public void setUp() {
110 MockitoAnnotations.initMocks(this);
111 final WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
112 final InstanceIdentifier<Rib> iid = InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(new RibId("test-rib"))).build();
113 final KeyedInstanceIdentifier<Tables, TablesKey> key = iid.child(LocRib.class).child(Tables.class, new TablesKey(LinkstateAddressFamily.class,
114 LinkstateSubsequentAddressFamily.class));
116 Mockito.doAnswer(new Answer<Void>() {
117 @SuppressWarnings("unchecked")
119 public Void answer(final InvocationOnMock invocation) throws Throwable {
120 final Object[] args = invocation.getArguments();
121 final InstanceIdentifier<Route> ii = (InstanceIdentifier<Route>) args[2];
122 final Route data = (Route) args[4];
123 wTx.put(LogicalDatastoreType.OPERATIONAL, ii, data, true);
127 }).when(this.adjRibTx).advertise(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any(), Mockito.<Peer>any(), Mockito.any(Route.class));
129 Mockito.doAnswer(new Answer<Void>() {
130 @SuppressWarnings("unchecked")
132 public Void answer(final InvocationOnMock invocation) throws Throwable {
133 final Object[] args = invocation.getArguments();
134 final InstanceIdentifier<Route> ii = (InstanceIdentifier<Route>) args[2];
135 wTx.delete(LogicalDatastoreType.OPERATIONAL, ii);
139 }).when(this.adjRibTx).withdraw(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any());
141 Mockito.doAnswer(new Answer<Void>() {
142 @SuppressWarnings("unchecked")
144 public Void answer(final InvocationOnMock invocation) throws Throwable {
145 final Object[] args = invocation.getArguments();
146 final InstanceIdentifier<Tables> basePath = (InstanceIdentifier<Tables>) args[0];
147 final Boolean uptodate = (Boolean) args[1];
148 final InstanceIdentifier<Attributes> aid = basePath.child(Attributes.class);
149 wTx.merge(LogicalDatastoreType.OPERATIONAL, aid, new AttributesBuilder().setUptodate(uptodate).build());
152 }).when(this.adjRibTx).setUptodate(Matchers.<InstanceIdentifier<Tables>>any(), Mockito.anyBoolean());
154 Mockito.doReturn(this.bgpComparator).when(this.adjRibTx).comparator();
156 Mockito.doReturn(iid).when(this.rib).getInstanceIdentifier();
157 Mockito.doReturn("test").when(this.peer).toString();
158 this.lrib = new LinkstateAdjRIBsIn(key);
160 this.dBuilder = new CLinkstateDestinationBuilder();
162 this.dBuilder.setProtocolId(ProtocolId.Direct);
163 this.dBuilder.setIdentifier(new Identifier(new BigInteger(new byte[] { 5 })));
164 this.dBuilder.setLocalNodeDescriptors(new LocalNodeDescriptorsBuilder().setAsNumber(TEST_AS_NUMBER).build());
168 public void testAddPrefix() {
169 this.dBuilder.setNlriType(NlriType.Ipv4Prefix);
170 this.dBuilder.setPrefixDescriptors(new PrefixDescriptorsBuilder().setIpReachabilityInformation(
171 new IpPrefix(new Ipv4Prefix("12.34.35.55/32"))).build());
172 this.destinations.add(this.dBuilder.build());
173 this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
174 new DestinationLinkstateCaseBuilder().setDestinationLinkstate(
175 new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
177 final PathAttributesBuilder pa = new PathAttributesBuilder();
178 pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
180 this.lrib.addRoutes(this.adjRibTx, this.peer, this.builder.build(), pa.build());
182 Mockito.verify(this.adjRibTx, Mockito.times(1)).advertise(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any(), Mockito.<Peer>any(), Mockito.any(Route.class));
183 Mockito.verify(this.adjRibTx, Mockito.times(1)).setUptodate(Matchers.<InstanceIdentifier<Tables>>any(), Matchers.anyBoolean());
187 public void testAddNode() {
188 this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
189 new DestinationLinkstateCaseBuilder().build()).build());
190 this.lrib.addRoutes(this.adjRibTx, this.peer, this.builder.build(), null);
192 this.dBuilder.setNlriType(NlriType.Node);
193 this.dBuilder.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder().setCRouterIdentifier(
194 new IsisPseudonodeCaseBuilder().setIsisPseudonode(
195 new IsisPseudonodeBuilder().setIsIsRouterIdentifier(
196 new IsIsRouterIdentifierBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[] { 1, 2, 3, 4, 5, 6 })).build()).build()).build()).build());
197 this.destinations.add(this.dBuilder.build());
198 this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
199 new DestinationLinkstateCaseBuilder().setDestinationLinkstate(
200 new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
202 final PathAttributesBuilder pa = new PathAttributesBuilder();
204 this.lrib.addRoutes(this.adjRibTx, this.peer, this.builder.build(), pa.build());
206 Mockito.verify(this.adjRibTx, Mockito.times(1)).advertise(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any(), Mockito.<Peer>any(), Mockito.any(Route.class));
207 Mockito.verify(this.adjRibTx, Mockito.times(1)).setUptodate(Matchers.<InstanceIdentifier<Tables>>any(), Matchers.anyBoolean());
211 public void testAddRemoveLink() {
212 this.dBuilder.setNlriType(NlriType.Link);
213 this.dBuilder.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder().setCRouterIdentifier(
214 new IsisPseudonodeCaseBuilder().setIsisPseudonode(
215 new IsisPseudonodeBuilder().setIsIsRouterIdentifier(
216 new IsIsRouterIdentifierBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[] { 1, 2, 3, 4, 5, 6 })).build()).build()).build()).build());
217 this.dBuilder.setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress(
218 new Ipv4InterfaceIdentifier(new Ipv4Address("127.0.0.1"))).build());
219 this.destinations.add(this.dBuilder.build());
220 this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
221 new DestinationLinkstateCaseBuilder().setDestinationLinkstate(
222 new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
224 final PathAttributesBuilder pa = new PathAttributesBuilder();
225 pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
227 this.lrib.addRoutes(this.adjRibTx, this.peer, this.builder.build(), pa.build());
229 Mockito.verify(this.adjRibTx, Mockito.times(1)).advertise(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any(), Mockito.<Peer>any(), Mockito.any(Route.class));
230 Mockito.verify(this.adjRibTx, Mockito.times(1)).setUptodate(Matchers.<InstanceIdentifier<Tables>>any(), Matchers.anyBoolean());
232 final MpUnreachNlriBuilder builder = new MpUnreachNlriBuilder();
233 builder.setAfi(LinkstateAddressFamily.class);
234 builder.setSafi(LinkstateSubsequentAddressFamily.class);
235 builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(
236 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCaseBuilder().setDestinationLinkstate(
237 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder().setCLinkstateDestination(
238 this.destinations).build()).build()).build());
239 this.lrib.removeRoutes(this.adjRibTx, this.peer, builder.build());
241 Mockito.verify(this.adjRibTx, Mockito.times(1)).withdraw(Mockito.<RouteEncoder>any(), Mockito.any(), Matchers.<InstanceIdentifier<Route>>any());
245 public void testAddAdvertisement() {
246 final PrefixCaseBuilder pcb = new PrefixCaseBuilder();
247 pcb.setAdvertisingNodeDescriptors(new AdvertisingNodeDescriptorsBuilder().build());
248 pcb.setIpReachabilityInformation(new IpPrefix(new Ipv4Prefix("127.0.0.1/32"))).build();
249 LinkstateRoute data = new LinkstateRouteBuilder().setObjectType(pcb.build()).build();
250 final MpReachNlriBuilder mpBuilder = new MpReachNlriBuilder();
251 this.lrib.addAdvertisement(mpBuilder, data);
252 final List<CLinkstateDestination> dests = ((DestinationLinkstateCase) mpBuilder.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate().getCLinkstateDestination();
253 assertEquals(NlriType.Ipv4Prefix, dests.get(0).getNlriType());
255 final NodeCaseBuilder ncb = new NodeCaseBuilder();
256 ncb.setNodeDescriptors(new NodeDescriptorsBuilder().build());
257 data = new LinkstateRouteBuilder().setObjectType(ncb.build()).build();
258 this.lrib.addAdvertisement(mpBuilder, data);
259 assertEquals(2, dests.size());
260 assertEquals(NlriType.Node, dests.get(1).getNlriType());
262 final LinkCaseBuilder lcb = new LinkCaseBuilder();
263 lcb.setLocalNodeDescriptors(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.routes.linkstate.routes.linkstate.route.object.type.link._case.LocalNodeDescriptorsBuilder().build());
264 lcb.setRemoteNodeDescriptors(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.routes.linkstate.routes.linkstate.route.object.type.link._case.RemoteNodeDescriptorsBuilder().build());
265 lcb.setLinkDescriptors(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.linkstate.routes.linkstate.routes.linkstate.route.object.type.link._case.LinkDescriptorsBuilder().build());
266 data = new LinkstateRouteBuilder().setObjectType(lcb.build()).build();
267 this.lrib.addAdvertisement(mpBuilder, data);
268 assertEquals(3, dests.size());
269 assertEquals(NlriType.Link, dests.get(2).getNlriType());
273 public void testAddWithdrawal() {
274 this.dBuilder.setNlriType(NlriType.Node);
275 final MpUnreachNlriBuilder paBuilder = new MpUnreachNlriBuilder().setWithdrawnRoutes(
276 new WithdrawnRoutesBuilder().setDestinationType(
277 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCaseBuilder().setDestinationLinkstate(
278 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder().setCLinkstateDestination(
279 Lists.newArrayList(this.dBuilder.build())).build()).build()).build());
281 final MpUnreachNlriBuilder mpUBuilder = new MpUnreachNlriBuilder();
282 this.lrib.addWithdrawal(mpUBuilder, this.dBuilder.build());
283 assertEquals(paBuilder.build(), mpUBuilder.build());