ELAN: skip remote unicast MACs
[netvirt.git] / vpnmanager / impl / src / test / java / org / opendaylight / netvirt / vpnmanager / intervpnlink / InterVpnLinkLocatorTest.java
1 /*
2  * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. 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.netvirt.vpnmanager.intervpnlink;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12 import static org.opendaylight.netvirt.vpnmanager.intervpnlink.InterVpnLinkTestCatalog.ALL_IVPN_LINKS;
13 import static org.opendaylight.netvirt.vpnmanager.intervpnlink.InterVpnLinkTestCatalog.I_VPN_LINK_12;
14 import static org.opendaylight.netvirt.vpnmanager.intervpnlink.InterVpnLinkTestCatalog.I_VPN_LINK_34;
15 import static org.opendaylight.netvirt.vpnmanager.intervpnlink.InterVpnLinkTestCatalog.I_VPN_LINK_56;
16
17 import java.math.BigInteger;
18 import java.util.Collections;
19 import java.util.List;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
23 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
24 import org.opendaylight.controller.md.sal.binding.test.ConstantSchemaAbstractDataBrokerTest;
25 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
26 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
27 import org.opendaylight.netvirt.vpnmanager.VpnOperDsUtils;
28 import org.opendaylight.netvirt.vpnmanager.VpnUtil;
29 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComposite;
30 import org.opendaylight.netvirt.vpnmanager.intervpnlink.L3VpnTestCatalog.L3VpnComposite;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id.VpnInstance;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id.VpnInstanceBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinkStates;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinkStatesBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinks;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinksBuilder;
42 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46 public class InterVpnLinkLocatorTest extends ConstantSchemaAbstractDataBrokerTest {
47
48     static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkLocatorTest.class);
49
50     DataBroker dataBroker;
51
52     InterVpnLinkLocator sut;
53
54     InterVpnLinkCacheImpl interVpnLinkCache;
55
56     @Before
57     public void setUp() throws Exception {
58
59         dataBroker = getDataBroker();
60
61         // Creating both empty containers: InterVpnLinks and InterVpnLinkStates
62         WriteTransaction writeTx = dataBroker.newWriteOnlyTransaction();
63         writeTx.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(InterVpnLinks.class).build(),
64                       new InterVpnLinksBuilder().setInterVpnLink(Collections.emptyList()).build(), true);
65         writeTx.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(InterVpnLinkStates.class).build(),
66                       new InterVpnLinkStatesBuilder().setInterVpnLinkState(Collections.emptyList()).build(), true);
67         writeTx.submit().checkedGet();
68
69         interVpnLinkCache = new InterVpnLinkCacheImpl(dataBroker);
70         interVpnLinkCache.initialFeed();
71
72         // Prepare
73         populateL3Vpns(dataBroker, L3VpnTestCatalog.ALL_VPNS);
74         InterVpnLinkTestCatalog.populateIvpnLinks(dataBroker, ALL_IVPN_LINKS);
75
76         for (InterVpnLinkDataComposite ivl : ALL_IVPN_LINKS) {
77             interVpnLinkCache.addInterVpnLinkToCaches(ivl.getInterVpnLinkConfig());
78             interVpnLinkCache.addInterVpnLinkStateToCaches(ivl.getInterVpnLinkState());
79         }
80
81         // SUT
82         sut = new InterVpnLinkLocator(dataBroker, interVpnLinkCache);
83     }
84
85
86     @Test
87     public void testFindInterVpnLinksSameGroup() throws TransactionCommitFailedException {
88
89         // I_VPN_LINK_56 is similar to I_VPN_LINK_12 (both link VPNs with same iRTs)
90         List<InterVpnLinkDataComposite> ivpnLinksSimilarTo12 =
91             sut.findInterVpnLinksSameGroup(I_VPN_LINK_12.getInterVpnLinkConfig(), ALL_IVPN_LINKS);
92         assertTrue(ivpnLinksSimilarTo12.size() == 1);
93         assertEquals(ivpnLinksSimilarTo12.get(0), I_VPN_LINK_56);
94
95         // There's no InterVpnLink similar to I_VPN_LINK_34
96         List<InterVpnLinkDataComposite> ivpnLinksSimilarTo34 =
97             sut.findInterVpnLinksSameGroup(I_VPN_LINK_34.getInterVpnLinkConfig(), ALL_IVPN_LINKS);
98         assertTrue(ivpnLinksSimilarTo34.isEmpty());
99     }
100
101     @Test
102     public void testSelectSuitableDpns_moreDpnsThanIvpnLinks() throws Exception {
103         stubNwUtilsGetOperativeDpns(5); // 5 operative DPNs - 3 IvpnLinks
104
105         System.setProperty(InterVpnLinkLocator.NBR_OF_DPNS_PROPERTY_NAME, "1");
106         List<BigInteger> vpnLink12Dpns = sut.selectSuitableDpns(I_VPN_LINK_12.getInterVpnLinkConfig());
107         InterVpnLinkTestCatalog.updateEndpointDpns(I_VPN_LINK_12, true, vpnLink12Dpns);
108         InterVpnLinkTestCatalog.updateEndpointDpns(I_VPN_LINK_12, false, vpnLink12Dpns);
109         interVpnLinkCache.addInterVpnLinkStateToCaches(I_VPN_LINK_12.getInterVpnLinkState());
110
111         List<BigInteger> vpnLink34Dpns = sut.selectSuitableDpns(I_VPN_LINK_34.getInterVpnLinkConfig());
112         InterVpnLinkTestCatalog.updateEndpointDpns(I_VPN_LINK_34, true, vpnLink34Dpns);
113         InterVpnLinkTestCatalog.updateEndpointDpns(I_VPN_LINK_34, false, vpnLink34Dpns);
114         interVpnLinkCache.addInterVpnLinkStateToCaches(I_VPN_LINK_34.getInterVpnLinkState());
115
116         List<BigInteger> vpnLink56Dpns = sut.selectSuitableDpns(I_VPN_LINK_56.getInterVpnLinkConfig());
117         InterVpnLinkTestCatalog.updateEndpointDpns(I_VPN_LINK_56, true, vpnLink56Dpns);
118         InterVpnLinkTestCatalog.updateEndpointDpns(I_VPN_LINK_56, false, vpnLink56Dpns);
119         interVpnLinkCache.addInterVpnLinkStateToCaches(I_VPN_LINK_56.getInterVpnLinkState());
120
121         assertTrue(vpnLink12Dpns.stream().filter(dpn -> vpnLink34Dpns.contains(dpn)).count() == 0);
122         assertTrue(vpnLink12Dpns.stream().filter(dpn -> vpnLink56Dpns.contains(dpn)).count() == 0);
123         assertTrue(vpnLink34Dpns.stream().filter(dpn -> vpnLink56Dpns.contains(dpn)).count() == 0);
124     }
125
126     //////////////
127     // Stubbing //
128     //////////////
129
130     public void populateL3Vpns(DataBroker broker, List<L3VpnComposite> vpns)
131         throws TransactionCommitFailedException {
132         for (L3VpnComposite vpn : vpns) {
133             VpnInstance vpnInstance = new VpnInstanceBuilder().setVpnId(vpn.vpnOpData.getVpnId())
134                 .setVpnInstanceName(vpn.vpnOpData.getVpnInstanceName())
135                 .setVrfId(vpn.vpnOpData.getVrfId())
136                 .build();
137             WriteTransaction writeTx1 = broker.newWriteOnlyTransaction();
138             writeTx1.merge(LogicalDatastoreType.CONFIGURATION,
139                           VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpn.vpnCfgData.getVpnInstanceName()),
140                           vpnInstance, true);
141             writeTx1.submit().checkedGet();
142             WriteTransaction writeTx2 = broker.newWriteOnlyTransaction();
143             writeTx2.merge(LogicalDatastoreType.OPERATIONAL,
144                           VpnUtil.getVpnInstanceOpDataIdentifier(vpn.vpnOpData.getVrfId()), vpn.vpnOpData, true);
145             writeTx2.submit().checkedGet();
146         }
147     }
148
149     public void cleanL3Vpns(DataBroker broker, List<L3VpnComposite> vpns)
150         throws TransactionCommitFailedException {
151         for (L3VpnComposite vpn : vpns) {
152             WriteTransaction writeTx1 = broker.newWriteOnlyTransaction();
153             writeTx1.delete(LogicalDatastoreType.OPERATIONAL,
154                            VpnUtil.getVpnInstanceOpDataIdentifier(vpn.vpnOpData.getVrfId()));
155             writeTx1.submit().checkedGet();
156
157             WriteTransaction writeTx2 = broker.newWriteOnlyTransaction();
158             writeTx2.delete(LogicalDatastoreType.CONFIGURATION,
159                            VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpn.vpnCfgData.getVpnInstanceName()));
160             writeTx2.submit().checkedGet();
161         }
162     }
163
164     private void stubNwUtilsGetOperativeDpns(int maxNbrOfOperativeDpns) throws Exception {
165         WriteTransaction writeTx1 = dataBroker.newWriteOnlyTransaction();
166         for (int i = 1; i <= maxNbrOfOperativeDpns; i++) {
167             NodeId nodeId = new NodeId("openflow:" + i);
168             Node node = new NodeBuilder().setId(nodeId).build();
169             writeTx1.merge(LogicalDatastoreType.OPERATIONAL,
170                           InstanceIdentifier.builder(Nodes.class).child(Node.class, new NodeKey(nodeId)).build(), node);
171         }
172         writeTx1.submit().checkedGet();
173     }
174
175 }