2 * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. 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.netvirt.vpnmanager.intervpnlink;
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;
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;
46 public class InterVpnLinkLocatorTest extends ConstantSchemaAbstractDataBrokerTest {
48 static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkLocatorTest.class);
50 DataBroker dataBroker;
52 InterVpnLinkLocator sut;
54 InterVpnLinkCacheImpl interVpnLinkCache;
57 public void setUp() throws Exception {
59 dataBroker = getDataBroker();
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();
69 interVpnLinkCache = new InterVpnLinkCacheImpl(dataBroker);
70 interVpnLinkCache.initialFeed();
73 populateL3Vpns(dataBroker, L3VpnTestCatalog.ALL_VPNS);
74 InterVpnLinkTestCatalog.populateIvpnLinks(dataBroker, ALL_IVPN_LINKS);
76 for (InterVpnLinkDataComposite ivl : ALL_IVPN_LINKS) {
77 interVpnLinkCache.addInterVpnLinkToCaches(ivl.getInterVpnLinkConfig());
78 interVpnLinkCache.addInterVpnLinkStateToCaches(ivl.getInterVpnLinkState());
82 sut = new InterVpnLinkLocator(dataBroker, interVpnLinkCache);
87 public void testFindInterVpnLinksSameGroup() throws TransactionCommitFailedException {
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);
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());
102 public void testSelectSuitableDpns_moreDpnsThanIvpnLinks() throws Exception {
103 stubNwUtilsGetOperativeDpns(5); // 5 operative DPNs - 3 IvpnLinks
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());
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());
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());
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);
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())
137 WriteTransaction writeTx1 = broker.newWriteOnlyTransaction();
138 writeTx1.merge(LogicalDatastoreType.CONFIGURATION,
139 VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpn.vpnCfgData.getVpnInstanceName()),
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();
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();
157 WriteTransaction writeTx2 = broker.newWriteOnlyTransaction();
158 writeTx2.delete(LogicalDatastoreType.CONFIGURATION,
159 VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpn.vpnCfgData.getVpnInstanceName()));
160 writeTx2.submit().checkedGet();
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);
172 writeTx1.submit().checkedGet();