Freeze upstream versions
[netvirt.git] / elanmanager / impl / src / test / java / org / opendaylight / netvirt / elanmanager / tests / utils / EvpnTestHelper.java
1 /*
2  * Copyright © 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.elanmanager.tests.utils;
9
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;
15
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.genius.datastoreutils.SingleTransactionDataBroker;
23 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
24 import org.opendaylight.mdsal.common.api.ReadFailedException;
25 import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
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.EvpnAugmentationBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstanceBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesKey;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.macvrfentries.MacVrfEntry;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.macvrfentries.MacVrfEntryBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.macvrfentries.MacVrfEntryKey;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentrybase.RoutePaths;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.EvpnRdToNetworks;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.evpn.rd.to.networks.EvpnRdToNetwork;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.evpn.rd.to.networks.EvpnRdToNetworkBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.evpn.rd.to.networks.EvpnRdToNetworkKey;
49 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
50 import org.opendaylight.yangtools.yang.common.Uint32;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53
54
55
56 @Singleton
57 public class EvpnTestHelper  {
58     private static final Logger LOG = LoggerFactory.getLogger(EvpnTestHelper.class);
59     private final SingleTransactionDataBroker singleTxdataBroker;
60
61     @Inject
62     public EvpnTestHelper(SingleTransactionDataBroker singleTxdataBroker) {
63         this.singleTxdataBroker = singleTxdataBroker;
64     }
65
66     public void updateRdtoNetworks(ElanInstance actualElanInstances) throws TransactionCommitFailedException {
67         EvpnRdToNetworkBuilder evpnRdToNetworkBuilder = new EvpnRdToNetworkBuilder()
68                 .withKey(new EvpnRdToNetworkKey(RD));
69         evpnRdToNetworkBuilder.setRd(RD);
70         evpnRdToNetworkBuilder.setNetworkId(ELAN1);
71         LOG.info("updating Evpn {} with elaninstance {} and rd {}", "evpn1", actualElanInstances, RD);
72         singleTxdataBroker.syncWrite(LogicalDatastoreType.CONFIGURATION, getRdToNetworkIdentifier(RD),
73                 evpnRdToNetworkBuilder.build());
74     }
75
76     public InstanceIdentifier<EvpnRdToNetwork> getRdToNetworkIdentifier(String vrfId) {
77         return InstanceIdentifier.builder(EvpnRdToNetworks.class)
78                 .child(EvpnRdToNetwork.class, new EvpnRdToNetworkKey(vrfId)).build();
79     }
80
81     public void updateEvpnNameInElan(String elanInstanceName, String evpnName)
82             throws ReadFailedException, TransactionCommitFailedException {
83         InstanceIdentifier<ElanInstance> elanIid = ElanHelper.getElanInstanceConfigurationDataPath(elanInstanceName);
84         ElanInstance elanInstance = singleTxdataBroker.syncRead(LogicalDatastoreType.CONFIGURATION, elanIid);
85         EvpnAugmentationBuilder evpnAugmentationBuilder = new EvpnAugmentationBuilder();
86         ElanInstanceBuilder elanInstanceBuilder = new ElanInstanceBuilder(elanInstance);
87         evpnAugmentationBuilder.setEvpnName(evpnName);
88         LOG.debug("Writing Elan-EvpnAugmentation evpnName {} with key {}", evpnName, elanInstanceName);
89         elanInstanceBuilder.addAugmentation(evpnAugmentationBuilder.build());
90         singleTxdataBroker.syncWrite(LogicalDatastoreType.CONFIGURATION, elanIid, elanInstanceBuilder.build());
91     }
92
93     public void deleteEvpnNameInElan(String elanInstanceName)
94             throws ReadFailedException, TransactionCommitFailedException {
95         InstanceIdentifier<ElanInstance> elanIid = ElanHelper.getElanInstanceConfigurationDataPath(elanInstanceName);
96         ElanInstance elanInstance = singleTxdataBroker.syncRead(LogicalDatastoreType.CONFIGURATION, elanIid);
97
98         EvpnAugmentationBuilder evpnAugmentationBuilder = new EvpnAugmentationBuilder();
99         ElanInstanceBuilder elanInstanceBuilder = new ElanInstanceBuilder(elanInstance);
100         evpnAugmentationBuilder.setEvpnName(null);
101         LOG.debug("deleting evpn name from Elan-EvpnAugmentation {} ",  elanInstanceName);
102         elanInstanceBuilder.addAugmentation(evpnAugmentationBuilder.build());
103         singleTxdataBroker.syncWrite(LogicalDatastoreType.CONFIGURATION, elanIid, elanInstanceBuilder.build());
104     }
105
106     public void deleteRdtoNetworks() throws TransactionCommitFailedException {
107         LOG.info("deleting  rd {}", "evpn1", RD);
108         singleTxdataBroker.syncDelete(LogicalDatastoreType.CONFIGURATION, getRdToNetworkIdentifier(RD));
109     }
110
111     public void addMacVrfEntryToDS(String rd, String macAddress, String prefix,
112                                    List<String> nextHopList, VrfEntry.EncapType encapType,
113                                    Uint32 l2vni, String gatewayMacAddress, RouteOrigin origin)
114             throws TransactionCommitFailedException {
115         MacVrfEntryBuilder macEntryBuilder = new MacVrfEntryBuilder().setOrigin(origin.getValue());
116         buildVpnEncapSpecificInfo(macEntryBuilder, encapType, l2vni, macAddress,
117                 gatewayMacAddress, nextHopList);
118         macEntryBuilder.setMac(macAddress);
119         macEntryBuilder.setDestPrefix(prefix);
120         InstanceIdentifier<MacVrfEntry> macEntryId =
121                 InstanceIdentifier.create(FibEntries.class)
122                         .child(VrfTables.class, new VrfTablesKey(rd))
123                         .child(MacVrfEntry.class, new MacVrfEntryKey(macAddress));
124
125         singleTxdataBroker.syncWrite(LogicalDatastoreType.CONFIGURATION, macEntryId, macEntryBuilder.build());
126     }
127
128     public void deleteMacVrfEntryToDS(String rd, String macAddress) throws TransactionCommitFailedException {
129         InstanceIdentifier<MacVrfEntry> macEntryId =
130                 InstanceIdentifier.create(FibEntries.class)
131                         .child(VrfTables.class, new VrfTablesKey(rd))
132                         .child(MacVrfEntry.class, new MacVrfEntryKey(macAddress));
133
134         singleTxdataBroker.syncDelete(LogicalDatastoreType.CONFIGURATION, macEntryId);
135     }
136
137     private static void buildVpnEncapSpecificInfo(MacVrfEntryBuilder builder,
138                                                   VrfEntry.EncapType encapType, Uint32 l2vni, String macAddress,
139                                                   String gatewayMac, List<String> nextHopList) {
140         builder.setEncapType(encapType);
141         builder.setGatewayMacAddress(gatewayMac);
142         builder.setL2vni(l2vni);
143         List<RoutePaths> routePaths = nextHopList.stream()
144                 .filter(StringUtils::isNotEmpty)
145                 .map(nextHop -> FibHelper.buildRoutePath(nextHop, null)).collect(Collectors.toList());
146         builder.setRoutePaths(routePaths);
147     }
148
149     public void attachEvpnToNetwork(ElanInstance elanInstance)
150             throws TransactionCommitFailedException, ReadFailedException {
151         // update RD to networks
152         updateRdtoNetworks(elanInstance);
153
154         // Attach EVPN to a network
155         updateEvpnNameInElan(ExpectedObjects.ELAN1, EVPN1);
156     }
157
158     public void detachEvpnToNetwork(String elanName) throws TransactionCommitFailedException, ReadFailedException {
159         deleteEvpnNameInElan(elanName);
160         deleteRdtoNetworks();
161     }
162
163     public void handleEvpnRt2Recvd(String macRecvd, String prefixRecvd) throws TransactionCommitFailedException {
164         List<String> nextHopList = new ArrayList<>();
165         nextHopList.add(DCGW_TEPIP);
166         addMacVrfEntryToDS(RD, macRecvd, prefixRecvd, nextHopList, VrfEntry.EncapType.Vxlan,
167                 ELAN1_SEGMENT_ID, null, RouteOrigin.BGP);
168     }
169
170     public InstanceIdentifier<MacVrfEntry> buildMacVrfEntryIid(String mac)  {
171         return InstanceIdentifier.create(FibEntries.class)
172                 .child(VrfTables.class, new VrfTablesKey(RD))
173                 .child(MacVrfEntry.class, new MacVrfEntryKey(mac));
174     }
175
176     public InstanceIdentifier<Networks> buildBgpNetworkIid(String prefix)  {
177         return InstanceIdentifier.create(Bgp.class)
178                 .child(NetworksContainer.class)
179                 .child(Networks.class, new NetworksKey(prefix, RD));
180     }
181
182 }