Merge "BUG-2383 : synchronize message/route linkstate core in model"
[bgpcep.git] / bgp / linkstate / src / test / java / org / opendaylight / protocol / bgp / linkstate / LinkstateAdjRIBsInTest.java
1 /*
2  * Copyright (c) 2014 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.protocol.bgp.linkstate;
9
10 import static org.junit.Assert.assertEquals;
11
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.rev150210.Identifier;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Ipv4InterfaceIdentifier;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateAddressFamily;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateSubsequentAddressFamily;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.ProtocolId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.isis.lan.identifier.IsIsRouterIdentifierBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.destination.CLinkstateDestination;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.destination.CLinkstateDestinationBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.LinkCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.NodeCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.PrefixCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.LinkDescriptorsBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.LocalNodeDescriptorsBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.RemoteNodeDescriptorsBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.node._case.NodeDescriptorsBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.prefix._case.AdvertisingNodeDescriptorsBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.prefix._case.PrefixDescriptorsBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.linkstate.routes.LinkstateRoute;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.routes.linkstate.routes.LinkstateRouteBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.IsisPseudonodeCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.isis.pseudonode._case.IsisPseudonodeBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationLinkstateCase;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationLinkstateCaseBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.mp.reach.nlri.advertized.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.OriginBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpReachNlriBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlriBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Route;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.LocRib;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Attributes;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.AttributesBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpOrigin;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
78 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
79 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
80
81 public class LinkstateAdjRIBsInTest extends AbstractDataBrokerTest {
82
83     private static final AsNumber TEST_AS_NUMBER = new AsNumber(35L);
84
85     @Mock
86     private RibReference rib;
87
88     @Mock
89     private Peer peer;
90
91     @Mock
92     private AdjRIBsTransaction adjRibTx;
93
94     @Mock
95     private RouteEncoder encoder;
96
97     private LinkstateAdjRIBsIn lrib;
98
99     private CLinkstateDestinationBuilder dBuilder;
100
101     private final MpReachNlriBuilder builder = new MpReachNlriBuilder();
102
103     private final List<CLinkstateDestination> destinations = new ArrayList<>();
104
105     private final BGPObjectComparator bgpComparator = new BGPObjectComparator(TEST_AS_NUMBER);
106
107     @Before
108     public void setUp() {
109         MockitoAnnotations.initMocks(this);
110         final WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
111         final InstanceIdentifier<Rib> iid = InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(new RibId("test-rib"))).build();
112         final KeyedInstanceIdentifier<Tables, TablesKey> key = iid.child(LocRib.class).child(Tables.class, new TablesKey(LinkstateAddressFamily.class,
113             LinkstateSubsequentAddressFamily.class));
114
115         Mockito.doAnswer(new Answer<Void>() {
116             @SuppressWarnings("unchecked")
117             @Override
118             public Void answer(final InvocationOnMock invocation) throws Throwable {
119                 final Object[] args = invocation.getArguments();
120                 final InstanceIdentifier<Route> ii = (InstanceIdentifier<Route>) args[2];
121                 final Route data = (Route) args[4];
122                 wTx.put(LogicalDatastoreType.OPERATIONAL, ii, data, true);
123                 return null;
124             }
125
126         }).when(this.adjRibTx).advertise(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any(), Mockito.<Peer>any(), Mockito.any(Route.class));
127
128         Mockito.doAnswer(new Answer<Void>() {
129             @SuppressWarnings("unchecked")
130             @Override
131             public Void answer(final InvocationOnMock invocation) throws Throwable {
132                 final Object[] args = invocation.getArguments();
133                 final InstanceIdentifier<Route> ii = (InstanceIdentifier<Route>) args[2];
134                 wTx.delete(LogicalDatastoreType.OPERATIONAL, ii);
135                 return null;
136             }
137
138         }).when(this.adjRibTx).withdraw(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any());
139
140         Mockito.doAnswer(new Answer<Void>() {
141             @SuppressWarnings("unchecked")
142             @Override
143             public Void answer(final InvocationOnMock invocation) throws Throwable {
144                 final Object[] args = invocation.getArguments();
145                 final InstanceIdentifier<Tables> basePath = (InstanceIdentifier<Tables>) args[0];
146                 final Boolean uptodate = (Boolean) args[1];
147                 final InstanceIdentifier<Attributes> aid = basePath.child(Attributes.class);
148                 wTx.merge(LogicalDatastoreType.OPERATIONAL, aid, new AttributesBuilder().setUptodate(uptodate).build());
149                 return null;
150             }
151         }).when(this.adjRibTx).setUptodate(Matchers.<InstanceIdentifier<Tables>>any(), Mockito.anyBoolean());
152
153         Mockito.doReturn(this.bgpComparator).when(this.adjRibTx).comparator();
154
155         Mockito.doReturn(iid).when(this.rib).getInstanceIdentifier();
156         Mockito.doReturn("test").when(this.peer).toString();
157         this.lrib = new LinkstateAdjRIBsIn(key);
158
159         this.dBuilder = new CLinkstateDestinationBuilder();
160
161         this.dBuilder.setProtocolId(ProtocolId.Direct);
162         this.dBuilder.setIdentifier(new Identifier(new BigInteger(new byte[] { 5 })));
163     }
164
165     @Test
166     public void testAddPrefix() {
167         this.dBuilder.setObjectType(new PrefixCaseBuilder()
168             .setAdvertisingNodeDescriptors(new AdvertisingNodeDescriptorsBuilder().setAsNumber(TEST_AS_NUMBER).build())
169             .setPrefixDescriptors(new PrefixDescriptorsBuilder().setIpReachabilityInformation(new IpPrefix(new Ipv4Prefix("12.34.35.55/32"))).build()).build());
170         this.destinations.add(this.dBuilder.build());
171         this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
172             new DestinationLinkstateCaseBuilder().setDestinationLinkstate(
173                 new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
174
175         final PathAttributesBuilder pa = new PathAttributesBuilder();
176         pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
177
178         this.lrib.addRoutes(this.adjRibTx, this.peer, this.builder.build(), pa.build());
179
180         Mockito.verify(this.adjRibTx, Mockito.times(1)).advertise(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any(), Mockito.<Peer>any(), Mockito.any(Route.class));
181         Mockito.verify(this.adjRibTx, Mockito.times(1)).setUptodate(Matchers.<InstanceIdentifier<Tables>>any(), Matchers.anyBoolean());
182     }
183
184     @Test
185     public void testAddNode() {
186         this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
187             new DestinationLinkstateCaseBuilder().build()).build());
188         this.lrib.addRoutes(this.adjRibTx, this.peer, this.builder.build(), null);
189
190         this.dBuilder.setObjectType(new NodeCaseBuilder().setNodeDescriptors(new NodeDescriptorsBuilder().setAsNumber(TEST_AS_NUMBER).setCRouterIdentifier(
191             new IsisPseudonodeCaseBuilder().setIsisPseudonode(
192                 new IsisPseudonodeBuilder().setIsIsRouterIdentifier(
193                     new IsIsRouterIdentifierBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[] { 1, 2, 3, 4, 5, 6 })).build()).build()).build()).build()).build());
194         this.destinations.add(this.dBuilder.build());
195         this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
196             new DestinationLinkstateCaseBuilder().setDestinationLinkstate(
197                 new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
198
199         final PathAttributesBuilder pa = new PathAttributesBuilder();
200
201         this.lrib.addRoutes(this.adjRibTx, this.peer, this.builder.build(), pa.build());
202
203         Mockito.verify(this.adjRibTx, Mockito.times(1)).advertise(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any(), Mockito.<Peer>any(), Mockito.any(Route.class));
204         Mockito.verify(this.adjRibTx, Mockito.times(1)).setUptodate(Matchers.<InstanceIdentifier<Tables>>any(), Matchers.anyBoolean());
205     }
206
207     @Test
208     public void testAddRemoveLink() {
209         final LinkCaseBuilder lCase = new LinkCaseBuilder();
210         lCase.setLocalNodeDescriptors(new LocalNodeDescriptorsBuilder().setAsNumber(TEST_AS_NUMBER).build());
211         lCase.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder().setAsNumber(TEST_AS_NUMBER).setCRouterIdentifier(
212             new IsisPseudonodeCaseBuilder().setIsisPseudonode(
213                 new IsisPseudonodeBuilder().setIsIsRouterIdentifier(
214                     new IsIsRouterIdentifierBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[] { 1, 2, 3, 4, 5, 6 })).build()).build()).build()).build());
215         lCase.setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress(
216             new Ipv4InterfaceIdentifier(new Ipv4Address("127.0.0.1"))).build());
217         this.dBuilder.setObjectType(lCase.build());
218         this.destinations.add(this.dBuilder.build());
219         this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
220             new DestinationLinkstateCaseBuilder().setDestinationLinkstate(
221                 new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build());
222
223         final PathAttributesBuilder pa = new PathAttributesBuilder();
224         pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build());
225
226         this.lrib.addRoutes(this.adjRibTx, this.peer, this.builder.build(), pa.build());
227
228         Mockito.verify(this.adjRibTx, Mockito.times(1)).advertise(Mockito.<RouteEncoder>any(), Mockito.any(), Mockito.<InstanceIdentifier<Route>>any(), Mockito.<Peer>any(), Mockito.any(Route.class));
229         Mockito.verify(this.adjRibTx, Mockito.times(1)).setUptodate(Matchers.<InstanceIdentifier<Tables>>any(), Matchers.anyBoolean());
230
231         final MpUnreachNlriBuilder builder = new MpUnreachNlriBuilder();
232         builder.setAfi(LinkstateAddressFamily.class);
233         builder.setSafi(LinkstateSubsequentAddressFamily.class);
234         builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(
235             new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCaseBuilder().setDestinationLinkstate(
236                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder().setCLinkstateDestination(
237                     this.destinations).build()).build()).build());
238         this.lrib.removeRoutes(this.adjRibTx, this.peer, builder.build());
239
240         Mockito.verify(this.adjRibTx, Mockito.times(1)).withdraw(Mockito.<RouteEncoder>any(), Mockito.any(), Matchers.<InstanceIdentifier<Route>>any());
241     }
242
243     @Test
244     public void testAddAdvertisement() {
245         final PrefixCaseBuilder pcb = new PrefixCaseBuilder();
246         pcb.setAdvertisingNodeDescriptors(new AdvertisingNodeDescriptorsBuilder().build());
247         pcb.setPrefixDescriptors(new PrefixDescriptorsBuilder().setIpReachabilityInformation(new IpPrefix(new Ipv4Prefix("127.0.0.1/32"))).build()).build();
248         LinkstateRoute data = new LinkstateRouteBuilder().setObjectType(pcb.build()).build();
249         final MpReachNlriBuilder mpBuilder = new MpReachNlriBuilder();
250         this.lrib.addAdvertisement(mpBuilder, data);
251         final List<CLinkstateDestination> dests = ((DestinationLinkstateCase) mpBuilder.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate().getCLinkstateDestination();
252
253         final NodeCaseBuilder ncb = new NodeCaseBuilder();
254         ncb.setNodeDescriptors(new NodeDescriptorsBuilder().build());
255         data = new LinkstateRouteBuilder().setObjectType(ncb.build()).build();
256         this.lrib.addAdvertisement(mpBuilder, data);
257         assertEquals(2, dests.size());
258
259         final LinkCaseBuilder lcb = new LinkCaseBuilder();
260         lcb.setLocalNodeDescriptors(new LocalNodeDescriptorsBuilder().build());
261         lcb.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder().build());
262         lcb.setLinkDescriptors(new LinkDescriptorsBuilder().build());
263         data = new LinkstateRouteBuilder().setObjectType(lcb.build()).build();
264         this.lrib.addAdvertisement(mpBuilder, data);
265         assertEquals(3, dests.size());
266     }
267
268     @Test
269     public void testAddWithdrawal() {
270         final MpUnreachNlriBuilder paBuilder = new MpUnreachNlriBuilder().setWithdrawnRoutes(
271             new WithdrawnRoutesBuilder().setDestinationType(
272                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCaseBuilder().setDestinationLinkstate(
273                     new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder().setCLinkstateDestination(
274                         Lists.newArrayList(this.dBuilder.build())).build()).build()).build());
275
276         final MpUnreachNlriBuilder mpUBuilder = new MpUnreachNlriBuilder();
277         this.lrib.addWithdrawal(mpUBuilder, this.dBuilder.build());
278         assertEquals(paBuilder.build(), mpUBuilder.build());
279     }
280 }