2 * Copyright © 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.elanmanager.tests.utils;
10 import static org.opendaylight.netvirt.elanmanager.tests.ElanServiceTestBase.DCGW_TEPIP;
11 import static org.opendaylight.netvirt.elanmanager.tests.ElanServiceTestBase.ELAN1;
12 import static org.opendaylight.netvirt.elanmanager.tests.ElanServiceTestBase.ELAN1_SEGMENT_ID;
13 import static org.opendaylight.netvirt.elanmanager.tests.ElanServiceTestBase.EVPN1;
14 import static org.opendaylight.netvirt.elanmanager.tests.ElanServiceTestBase.RD;
16 import java.util.ArrayList;
17 import java.util.List;
18 import java.util.stream.Collectors;
19 import javax.inject.Inject;
20 import javax.inject.Singleton;
21 import org.apache.commons.lang3.StringUtils;
22 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
23 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
24 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
25 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
26 import org.opendaylight.netvirt.elanmanager.api.ElanHelper;
27 import org.opendaylight.netvirt.elanmanager.tests.ExpectedObjects;
28 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
29 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
30 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.Bgp;
31 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NetworksContainer;
32 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.networkscontainer.Networks;
33 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.networkscontainer.NetworksKey;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.EvpnAugmentation;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.EvpnAugmentationBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstanceBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.macvrfentries.MacVrfEntry;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.macvrfentries.MacVrfEntryBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.macvrfentries.MacVrfEntryKey;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentrybase.RoutePaths;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.EvpnRdToNetworks;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.evpn.rd.to.networks.EvpnRdToNetwork;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.evpn.rd.to.networks.EvpnRdToNetworkBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.evpn.rd.to.networks.EvpnRdToNetworkKey;
50 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
51 import org.opendaylight.yangtools.yang.common.Uint32;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
58 public class EvpnTestHelper {
59 private static final Logger LOG = LoggerFactory.getLogger(EvpnTestHelper.class);
60 private SingleTransactionDataBroker singleTxdataBroker;
63 public EvpnTestHelper(SingleTransactionDataBroker singleTxdataBroker) {
64 this.singleTxdataBroker = singleTxdataBroker;
67 public void updateRdtoNetworks(ElanInstance actualElanInstances) throws TransactionCommitFailedException {
68 EvpnRdToNetworkBuilder evpnRdToNetworkBuilder = new EvpnRdToNetworkBuilder()
69 .withKey(new EvpnRdToNetworkKey(RD));
70 evpnRdToNetworkBuilder.setRd(RD);
71 evpnRdToNetworkBuilder.setNetworkId(ELAN1);
72 LOG.info("updating Evpn {} with elaninstance {} and rd {}", "evpn1", actualElanInstances, RD);
73 singleTxdataBroker.syncWrite(LogicalDatastoreType.CONFIGURATION, getRdToNetworkIdentifier(RD),
74 evpnRdToNetworkBuilder.build());
77 public InstanceIdentifier<EvpnRdToNetwork> getRdToNetworkIdentifier(String vrfId) {
78 return InstanceIdentifier.builder(EvpnRdToNetworks.class)
79 .child(EvpnRdToNetwork.class, new EvpnRdToNetworkKey(vrfId)).build();
82 public void updateEvpnNameInElan(String elanInstanceName, String evpnName)
83 throws ReadFailedException, TransactionCommitFailedException {
84 InstanceIdentifier<ElanInstance> elanIid = ElanHelper.getElanInstanceConfigurationDataPath(elanInstanceName);
85 ElanInstance elanInstance = singleTxdataBroker.syncRead(LogicalDatastoreType.CONFIGURATION, elanIid);
86 EvpnAugmentationBuilder evpnAugmentationBuilder = new EvpnAugmentationBuilder();
87 ElanInstanceBuilder elanInstanceBuilder = new ElanInstanceBuilder(elanInstance);
88 evpnAugmentationBuilder.setEvpnName(evpnName);
89 LOG.debug("Writing Elan-EvpnAugmentation evpnName {} with key {}", evpnName, elanInstanceName);
90 elanInstanceBuilder.addAugmentation(EvpnAugmentation.class, evpnAugmentationBuilder.build());
91 singleTxdataBroker.syncWrite(LogicalDatastoreType.CONFIGURATION, elanIid, elanInstanceBuilder.build());
94 public void deleteEvpnNameInElan(String elanInstanceName)
95 throws ReadFailedException, TransactionCommitFailedException {
96 InstanceIdentifier<ElanInstance> elanIid = ElanHelper.getElanInstanceConfigurationDataPath(elanInstanceName);
97 ElanInstance elanInstance = singleTxdataBroker.syncRead(LogicalDatastoreType.CONFIGURATION, elanIid);
99 EvpnAugmentationBuilder evpnAugmentationBuilder = new EvpnAugmentationBuilder();
100 ElanInstanceBuilder elanInstanceBuilder = new ElanInstanceBuilder(elanInstance);
101 evpnAugmentationBuilder.setEvpnName(null);
102 LOG.debug("deleting evpn name from Elan-EvpnAugmentation {} ", elanInstanceName);
103 elanInstanceBuilder.addAugmentation(EvpnAugmentation.class, evpnAugmentationBuilder.build());
104 singleTxdataBroker.syncWrite(LogicalDatastoreType.CONFIGURATION, elanIid, elanInstanceBuilder.build());
107 public void deleteRdtoNetworks() throws TransactionCommitFailedException {
108 LOG.info("deleting rd {}", "evpn1", RD);
109 singleTxdataBroker.syncDelete(LogicalDatastoreType.CONFIGURATION, getRdToNetworkIdentifier(RD));
112 public void addMacVrfEntryToDS(String rd, String macAddress, String prefix,
113 List<String> nextHopList, VrfEntry.EncapType encapType,
114 Uint32 l2vni, String gatewayMacAddress, RouteOrigin origin)
115 throws TransactionCommitFailedException {
116 MacVrfEntryBuilder macEntryBuilder = new MacVrfEntryBuilder().setOrigin(origin.getValue());
117 buildVpnEncapSpecificInfo(macEntryBuilder, encapType, l2vni, macAddress,
118 gatewayMacAddress, nextHopList);
119 macEntryBuilder.setMac(macAddress);
120 macEntryBuilder.setDestPrefix(prefix);
121 InstanceIdentifier<MacVrfEntry> macEntryId =
122 InstanceIdentifier.builder(FibEntries.class)
123 .child(VrfTables.class, new VrfTablesKey(rd))
124 .child(MacVrfEntry.class, new MacVrfEntryKey(macAddress)).build();
126 singleTxdataBroker.syncWrite(LogicalDatastoreType.CONFIGURATION, macEntryId, macEntryBuilder.build());
129 public void deleteMacVrfEntryToDS(String rd, String macAddress) throws TransactionCommitFailedException {
130 InstanceIdentifier<MacVrfEntry> macEntryId =
131 InstanceIdentifier.builder(FibEntries.class)
132 .child(VrfTables.class, new VrfTablesKey(rd))
133 .child(MacVrfEntry.class, new MacVrfEntryKey(macAddress)).build();
135 singleTxdataBroker.syncDelete(LogicalDatastoreType.CONFIGURATION, macEntryId);
138 private static void buildVpnEncapSpecificInfo(MacVrfEntryBuilder builder,
139 VrfEntry.EncapType encapType, Uint32 l2vni, String macAddress,
140 String gatewayMac, List<String> nextHopList) {
141 builder.setEncapType(encapType);
142 builder.setGatewayMacAddress(gatewayMac);
143 builder.setL2vni(l2vni);
144 List<RoutePaths> routePaths = nextHopList.stream()
145 .filter(StringUtils::isNotEmpty)
147 return FibHelper.buildRoutePath(nextHop, null);
148 }).collect(Collectors.toList());
149 builder.setRoutePaths(routePaths);
152 public void attachEvpnToNetwork(ElanInstance elanInstance)
153 throws TransactionCommitFailedException, ReadFailedException {
154 // update RD to networks
155 updateRdtoNetworks(elanInstance);
157 // Attach EVPN to a network
158 updateEvpnNameInElan(ExpectedObjects.ELAN1, EVPN1);
161 public void detachEvpnToNetwork(String elanName) throws TransactionCommitFailedException, ReadFailedException {
162 deleteEvpnNameInElan(elanName);
163 deleteRdtoNetworks();
166 public void handleEvpnRt2Recvd(String macRecvd, String prefixRecvd) throws TransactionCommitFailedException {
167 List<String> nextHopList = new ArrayList<>();
168 nextHopList.add(DCGW_TEPIP);
169 addMacVrfEntryToDS(RD, macRecvd, prefixRecvd, nextHopList, VrfEntry.EncapType.Vxlan,
170 ELAN1_SEGMENT_ID, null, RouteOrigin.BGP);
173 public InstanceIdentifier<MacVrfEntry> buildMacVrfEntryIid(String mac) {
174 return InstanceIdentifier.builder(FibEntries.class)
175 .child(VrfTables.class, new VrfTablesKey(RD))
176 .child(MacVrfEntry.class, new MacVrfEntryKey(mac)).build();
179 public InstanceIdentifier<Networks> buildBgpNetworkIid(String prefix) {
180 return InstanceIdentifier.builder(Bgp.class)
181 .child(NetworksContainer.class)
182 .child(Networks.class, new NetworksKey(prefix, RD)).build();